В этом посте я расскажу вам о трех разных методах выполнения того, о чем вы просите.Я на самом деле рекомендую использовать последний фрагмент, так как его легче понять, а также он достаточно аккуратен в коде.
Как мне увидеть, какие элементы в массиве соответствуют моему регулярному выражению?
Для этой цели выделена функция preg_grep
.В качестве первого параметра будет использоваться регулярное выражение, а в качестве второго - массив.
См. Приведенный ниже пример:
$haystack = array (
'say hello',
'hello stackoverflow',
'hello world',
'foo bar bas'
);
$matches = preg_grep ('/^hello (\w+)/i', $haystack);
print_r ($matches);
output
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
)
Документация
Использование array_reduce
кажется утомительным, разве нет другого пути?
Да, и этот на самом деле чище, хотя он не предполагает использования какой-либо ранее существующей функции array_*
или preg_*
.
Оберните ее в функцию, если вы собираетесь использовать этот метод более одного раза.
$matches = array ();
foreach ($haystack as $str)
if (preg_match ('/^hello (\w+)/i', $str, $m))
$matches[] = $m[1];
Документация