我正在尝试使用filter_var_array函数从我的数组值中删除除 az 字符之外的所有字符。
我尝试应用多个过滤器,但不幸的是它们都没有对我有用,有没有其他方法可以使用这个函数来做到这一点,或者我是否被迫在 foreach 循环中使用正则表达式之类的东西来做到这一点?
我正在尝试使用filter_var_array函数从我的数组值中删除除 az 字符之外的所有字符。
我尝试应用多个过滤器,但不幸的是它们都没有对我有用,有没有其他方法可以使用这个函数来做到这一点,或者我是否被迫在 foreach 循环中使用正则表达式之类的东西来做到这一点?
$f = function ($string) { return preg_replace('~[^a-z]~i', '', $string); };
$myValues = array_map($f, $myValues);
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
.
我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 );
与其他答案一样,这个答案再次基于掌握正则表达式,这本质上是所有这些验证器所依赖的基本字符扫描(和解析)技术。关于验证器/过滤器的想法是定义/猜测/覆盖尽可能多的合理字符串类(正则表达式)。(此外,对于 [0-9]* 或 [az]* 等琐碎的类也有优化速度 - 无需通过标准的 perl-compatible)
作为一个简短的评论:确实,像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) ""
}
}
也许不比 foreach 好,但它是“另一种方式”:
array_walk($a, function(&$e) {
$e = preg_replace('/[^a-z]/', '', $e);
});
(如果您使用这种匿名函数语法,则需要 PHP 5.3,也称为“闭包”。)