preg_match不适用于我的数组

时间:2012-01-04 02:37:35

标签: php arrays preg-match

我这里只有一个测试模式,但它确实禁止空格。

$myarray[]='s s';
if (preg_match('/[^\d\w\(\)\[\]\.\-]+/',$myarray)>0) echo 'yes';

这没什么,但是

$test='s s';
if (preg_match('/[^\d\w\(\)\[\]\.\-]+/',$test)>0) echo 'yes';

这很好用...... 我不明白为什么它不适用于我的阵列?

3 个答案:

答案 0 :(得分:2)

您无法在阵列上执行类似的操作。正如您在the documentation on preg_match()中所看到的,它需要一个字符串作为第二个参数,而不是一个数组。

int preg_match ( string $pattern , string $subject
      [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

相反,您必须告诉它要对哪个元素进行操作。

如果要对数组中的一个元素执行此操作,只需使用其索引即可。例如。第一个元素是$myarray[0],因此以下内容应该有效:

if (preg_match('/[^\d\w\(\)\[\]\.\-]+/',$myarray[0])>0) echo 'yes';

另一方面,如果您希望对阵列中的每个元素执行此操作,则可以

  • 创建一个foreach循环

    foreach ($myarray as $element) {
      if (preg_match('/[^\d\w\(\)\[\]\.\-]+/',$element)>0) echo 'yes';
    }
    
  • 使用array_map()和回调函数

    function match_callback($element) {
      if (preg_match('/[^\d\w\(\)\[\]\.\-]+/',$element)>0) echo 'yes';
    }
    array_map('match_callback',$myarray);
    

答案 1 :(得分:1)

preg_match不接受数组作为输入,只接受一个字符串。你需要做一些像......

$matched = no;
foreach($myarray as $x) {
    if (preg_match('/[^\d\w\(\)\[\]\.\-]+/',$x)>0) $matched = true;
}
if($matched) echo 'yes';

一步到位:

function preg_match_any($regex,$array) {
    foreach($array as $x) {
        if (preg_match($regex,$x)>0) return true;
    }
    return false;
}

//Then to call it just something like:
if (preg_match_any('/[^\d\w\(\)\[\]\.\-]+/',$myarray)) echo 'yes';

答案 2 :(得分:0)

您不能使用数组作为主题,因为preg_match只接受字符串。您可以使用匿名函数(php 5.3 +):

$ret = array_map(function($element) {    
    return preg_replace('/[^\d\w\(\)\[\]\.\-]+/', '', $element) > 0; 
}, $myarray );