Как искать в массиве с 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 )
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 )
Документация
array_reduce
кажется утомительным, разве нет другого пути? Да, и этот на самом деле чище, хотя он не предполагает использование ранее существовавшей функции array_*
или preg_*
.
Оберните его в функцию, если вы собираетесь использовать этот метод более одного раза.
$matches = array (); foreach ($haystack as $str) if (preg_match ('/^hello (\w+)/i', $str, $m)) $matches[] = $m[1];
Документация
Использовать preg_grep
$array = preg_grep( '/(my\n+string\n+)/i', array( 'file' , 'my string => name', 'this') );
Вы можете использовать array_walk
чтобы применить preg_match
к каждому элементу массива.
$items = array(); foreach ($haystacks as $haystack) { if (preg_match($pattern, $haystack, $matches) $items[] = $matches[1]; }