我试图从使用filter_var_array函数的a-z字符除去我的数组值中的所有字符。php使用filter_var_array去除除a-z之外的任何东西
我试过应用多个filters,但不幸的是他们都没有为我做的伎俩,是否有任何其他方式来做到这一点使用此功能,或者我不得不在foreach循环中使用正则表达式这样做?
我试图从使用filter_var_array函数的a-z字符除去我的数组值中的所有字符。php使用filter_var_array去除除a-z之外的任何东西
我试过应用多个filters,但不幸的是他们都没有为我做的伎俩,是否有任何其他方式来做到这一点使用此功能,或者我不得不在foreach循环中使用正则表达式这样做?
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
。
呵呵,是的,你说得对:D你可以省略'+'。 – KingCrunch 2013-03-14 01:44:49
确实如此,但我猜测+通过删除非alpha的块**,而不是单个的**字符**,使它*略微更有效。但只有一个分析器可以肯定地说。 (然而,使用*会在时空连续体中产生裂痕。) – 2013-03-14 01:51:52
这很有趣。我认为它应该更快_without_'+',因为它会减少模式匹配本身的一步。我担心正确的答案是“内部没有区别(执行路径除外)”:D – KingCrunch 2013-03-14 01:58:26
也许没有比的foreach更好,但它是一个“其他方式”:
array_walk($a, function(&$e) {
$e = preg_replace('/[^a-z]/', '', $e);
});
(需要PHP如果你使用这个匿名函数的语法5.3,也被称为“封闭”)
匿名函数和闭包是两个不同的东西。刚才说:)(实际上,闭包是匿名函数的一个子集)。 – KingCrunch 2013-03-14 01:30:38
真的@KingCrunch?在[匿名函数](http://php.net/manual/en/functions.anonymous.php)和[Closure类]的PHP文档中(http://www.php.net/manual/en/class .closure.php)我还没有看到这种区别。你做? – 2013-03-14 01:35:30
区别不是来自PHP:匿名函数是一个没有名字的函数。闭包是一个匿名函数,带有对非局部变量的附加引用。严格地说,函数foo(){}'是一个匿名函数,'function foo()use($ bar){}'是一个闭包。在PHP中,差异根本无关紧要,因此区别并不重要,但其他语言使用这一事实:函数(而不是闭包)不应该有任何副作用来进行并行化。 – KingCrunch 2013-03-14 01:41:29
我个人使用array_map
和一个正则表达式。与其他答案这个也是基于掌握regular expressions,这基本上是的基本特征扫描(和解析)技术所有的验证都在建
$array = Array("abc123", "123jkl", "abc123def");
$array = array_map("preg_replace",
array_fill(0, count($array), '/[^a-z]*/'),
array_fill(0, count($array), ''),
$array);
。关于验证器/过滤器的想法是尽可能多地定义/猜测/覆盖尽可能多的合理的classes of strings(regexps)。 (加有用于琐碎类的优化速度像[0-9] *或[AZ] * - 无需通过标准Perl兼容去)
作为一个快速备注:的确,像FILTER_VALIDATE_REGEXP没有为我工作,要么...
filter_var_array &合作。是相对较新的做法,但如果你必须然后退回到在following形式的任何自定义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) ""
}
}
$f = function ($string) { return preg_replace('~[^a-z]~i', '', $string); };
$myValues = array_map($f, $myValues);
在PHP中,匿名函数是否存在“垃圾回收”的问题? – 2013-03-14 01:39:40
@YauhenYakimovich你在说什么?除此之外,这很大程度上取决于你使用的版本,你作为一个用户应该永远不需要关心GC,因为内置的GC在他的工作上相当不错:) – KingCrunch 2013-03-14 01:42:56
我记得GC主要是PHP中的引用计数机制。是的 - 匿名函数确实有内存泄漏..只是想知道什么是目前的状态(例如使用匿名函数生产代码) – 2013-03-14 01:50:55
你确定你已经尝试过'FILTER_FLAG_STRIP_HIGH'过滤器吗? – edwardmp 2013-03-14 00:54:41
建议更明确地说明是否需要区分大小写。如果是这样,请提及应删除大写字符。如果没有(这是我怀疑你想要的),那么应该保留a-z和A-Z。另外假设你想剥离exotics ä&egrave; &otilde ;.如果你确实想剥离它们,那么我建议不需要改变,但只是检查。另外,它是一个令人失望的答案大多数不使用过滤器,因为你问? – 2013-03-15 12:31:11