2

我正在尝试使用filter_var_array函数从我的数组值中删除除 az 字符之外的所有字符。

我尝试应用多个过滤器,但不幸的是它们都没有对我有用,有没有其他方法可以使用这个函数来做到这一点,或者我是否被迫在 foreach 循环中使用正则表达式之类的东西来做到这一点?

4

5 回答 5

2
$f = function ($string) { return preg_replace('~[^a-z]~i', '', $string); };
$myValues = array_map($f, $myValues);
于 2013-03-14T01:27:02.270 回答
2

preg_replace()已经很自然地在数组上工作了。这会从字符串数组中删除所有非字母:

$array = preg_replace('/[^a-z]/i', '', $array);

例子:

$a = array('1111A55b999c0000','111111def9999999','0000000g88888hi8888888');
$a = preg_replace('/[^a-z]/i', '', $a);
assert($a == array('Abc','def','ghi'));

我猜你可能想要不区分大小写。如果你真的想去掉大写字母,只需删除i.

于 2013-03-14T01:41:25.457 回答
1

array_map个人会使用和一个正则表达式。

     $array = Array("abc123", "123jkl", "abc123def");
     $array = array_map("preg_replace", 
                         array_fill(0, count($array), '/[^a-z]*/'), 
                         array_fill(0, count($array), ''),
                         $array );
于 2013-03-14T01:06:51.663 回答
0

扫描 == 正则表达式

与其他答案一样,这个答案再次基于掌握正则表达式,这本质上是所有这些验证器所依赖的基本字符扫描(和解析)技术关于验证器/过滤器的想法是定义/猜测/覆盖尽可能多的合理字符串类(正则表达式)。(此外,对于 [0-9]* 或 [az]* 等琐碎的类也有优化速度 - 无需通过标准的 perl-compatible

filter_var_array 和回调

作为一个简短的评论:确实,像FILTER_VALIDATE_REGEXP这样的东西对我也不起作用......

filter_var_array & co. 是相对较新的做法,但如果您必须回退到任何自定义 FILTER_CALLBACK以下形式工作:

<?php
error_reporting(E_ALL | E_STRICT);

function handle($value) {
    return preg_replace('/[^a-z]/', '', $value);
}

$data = array(
    'testfield'    => array('22', 'foo', 'bar', '42'),
);

$args = array(
    'testfield'    => array('filter'    => FILTER_CALLBACK,
                            'options'   => 'handle'
        ),
    );

$result = filter_var_array($data, $args);

var_dump($result);

并生产

array(1) {
  ["testfield"]=>
  array(4) {
    [0]=>
    string(0) ""
    [1]=>
    string(3) "foo"
    [2]=>
    string(3) "bar"
    [3]=>
    string(0) ""
  }
}
于 2013-03-14T01:22:28.187 回答
-1

也许不比 foreach 好,但它是“另一种方式”:

array_walk($a, function(&$e) {
    $e = preg_replace('/[^a-z]/', '', $e);
});

(如果您使用这种匿名函数语法,则需要 PHP 5.3,也称为“闭包”。)

于 2013-03-14T01:02:32.633 回答