Как искать в массиве с 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! } ?> 

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

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

Существует функция, предназначенная для этой цели, 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 ) 

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

  • PHP: preg_grep – Руководство

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

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; } // NOTE : // ------------------------------------------------------------------------------ // 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 ) 

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

  • PHP: array_reduce – Руководство
  • PHP: preg_match – Руководство

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

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

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

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

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

  • PHP: preg_match – Руководство

Использовать preg_grep

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

Вы можете использовать array_walk чтобы применить preg_match к каждому элементу массива.

http://us3.php.net/array_walk

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