Подтвердить что ты не робот

Как искать в массиве с preg_match?

Как выполнить поиск в массиве с preg_match?

Пример:

<?php
if( preg_match( '/(my\n+string\n+)/i' , array( 'file' , 'my string  => name', 'this') , $match) )
{
    //Excelent!!
    $items[] = $match[1];
} else {
    //Ups! not found!
}
?>
4b9b3361

Ответ 1

В этом посте я предоставлю вам три разных способа делать то, что вы просите. Я действительно рекомендую использовать последний фрагмент, так как он проще всего понять, а также быть довольно аккуратным в коде.

Как узнать, какие элементы в массиве соответствуют моему регулярному выражению?

Для этой цели существует функция, preg_grep. Он примет регулярное выражение как первый параметр, а массив - второй.

См. пример ниже:

$haystack = array (
  'say hello',
  'hello stackoverflow',
  'hello world',
  'foo bar bas'
);

$matches  = preg_grep ('/^hello (\w+)/i', $haystack);

print_r ($matches);

Выход

Array
(
    [1] => hello stackoverflow
    [2] => hello world
)

Документация


Но я просто хочу получить значение указанных групп. Как?

array_reduce с preg_match может решить эту проблему чистым образом; см. ниже фрагмент.

$haystack = array (
  'say hello',
  'hello stackoverflow',
  'hello world',
  'foo bar bas'
);

function _matcher ($m, $str) {
  if (preg_match ('/^hello (\w+)/i', $str, $matches))
    $m[] = $matches[1];

  return $m;
}

// N O T E :
// ------------------------------------------------------------------------------
// you could specify '_matcher' as an anonymous function directly to
// array_reduce though that kind of decreases readability and is therefore
// not recommended, but it is possible.

$matches = array_reduce ($haystack, '_matcher', array ());

print_r ($matches);

Выход

Array
(
    [0] => stackoverflow
    [1] => world
)

Documentation


Использование array_reduce кажется утомительным, нет другого пути?

Да, и этот режим действительно более чистый, хотя он не предполагает использование ранее существовавшей функции array_* или preg_*.

Оберните его в функцию, если вы собираетесь использовать этот метод более одного раза.

$matches = array ();

foreach ($haystack as $str) 
  if (preg_match ('/^hello (\w+)/i', $str, $m))
    $matches[] = $m[1];

Documentation

Ответ 2

Используйте preg_grep

$array = preg_grep(
    '/(my\n+string\n+)/i',
    array( 'file' , 'my string  => name', 'this')
);

Ответ 3

Вы можете использовать array_walk для применения вашей функции preg_match к каждому элементу массива.

http://us3.php.net/array_walk

Ответ 4

$items = array();
foreach ($haystacks as $haystack) {
    if (preg_match($pattern, $haystack, $matches)
        $items[] = $matches[1];
}