preg_match не работает с моим массивом - PullRequest
0 голосов
/ 04 января 2012

У меня здесь только тестовый шаблон, но он запрещает пробелы.

$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 ]

2 голосов
/ 04 января 2012

Вы не можете выполнить такую ​​операцию над массивом. Как вы можете видеть в документации по 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 голос
/ 04 января 2012

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';
0 голосов
/ 04 января 2012

Вы не можете использовать массив в качестве темы, так как preg_match принимает только строку.Вы можете использовать анонимную функцию (php 5.3 +):

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