2013-03-14 124 views
2

我试图从使用filter_var_array函数的a-z字符除去我的数组值中的所有字符。php使用filter_var_array去除除a-z之外的任何东西

我试过应用多个filters,但不幸的是他们都没有为我做的伎俩,是否有任何其他方式来做到这一点使用此功能,或者我不得不在foreach循环中使用正则表达式这样做?

+0

你确定你已经尝试过'FILTER_FLAG_STRIP_HIGH'过滤器吗? – edwardmp 2013-03-14 00:54:41

+0

建议更明确地说明是否需要区分大小写。如果是这样,请提及应删除大写字符。如果没有(这是我怀疑你想要的),那么应该保留a-z和A-Z。另外假设你想剥离exotics äè &otilde ;.如果你确实想剥离它们,那么我建议不需要改变,但只是检查。另外,它是一个令人失望的答案大多数不使用过滤器,因为你问? – 2013-03-15 12:31:11

回答

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

+0

呵呵,是的,你说得对:D你可以省略'+'。 – KingCrunch 2013-03-14 01:44:49

+0

确实如此,但我猜测+通过删除非alpha的块**,而不是单个的**字符**,使它*略微更有效。但只有一个分析器可以肯定地说。 (然而,使用*会在时空连续体中产生裂痕。) – 2013-03-14 01:51:52

+1

这很有趣。我认为它应该更快_without_'+',因为它会减少模式匹配本身的一步。我担心正确的答案是“内部没有区别(执行路径除外)”:D – KingCrunch 2013-03-14 01:58:26

-1

也许没有比的foreach更好,但它是一个“其他方式”:

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

(需要PHP如果你使用这个匿名函数的语法5.3,也被称为“封闭”)

+0

匿名函数和闭包是两个不同的东西。刚才说:)(实际上,闭包是匿名函数的一个子集)。 – KingCrunch 2013-03-14 01:30:38

+0

真的@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

+0

区别不是来自PHP:匿名函数是一个没有名字的函数。闭包是一个匿名函数,带有对非局部变量的附加引用。严格地说,函数foo(){}'是一个匿名函数,'function foo()use($ bar){}'是一个闭包。在PHP中,差异根本无关紧要,因此区别并不重要,但其他语言使用这一事实:函数(而不是闭包)不应该有任何副作用来进行并行化。 – KingCrunch 2013-03-14 01:41:29

1

我个人使用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); 
0

扫描==正则表达式

。关于验证器/过滤器的想法是尽可能多地定义/猜测/覆盖尽可能多的合理的classes of strings(regexps)。 (加有用于琐碎类的优化速度像[0-9] *或[AZ] * - 无需通过标准Perl兼容去)

filter_var_array和回调

作为一个快速备注:的确,像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) "" 
    } 
} 
2
$f = function ($string) { return preg_replace('~[^a-z]~i', '', $string); }; 
$myValues = array_map($f, $myValues); 
+0

在PHP中,匿名函数是否存在“垃圾回收”的问题? – 2013-03-14 01:39:40

+0

@YauhenYakimovich你在说什么?除此之外,这很大程度上取决于你使用的版本,你作为一个用户应该永远不需要关心GC,因为内置的GC在他的工作上相当不错:) – KingCrunch 2013-03-14 01:42:56

+0

我记得GC主要是PHP中的引用计数机制。是的 - 匿名函数确实有内存泄漏..只是想知道什么是目前的状态(例如使用匿名函数生产代码) – 2013-03-14 01:50:55

相关问题