Comment rechercher dans un tableau avec preg match?
comment rechercher dans un tableau avec preg_match?
Exemple:
<?php
if( preg_match( '/(myn+stringn+)/i' , array( 'file' , 'my string => name', 'this') , $match) )
{
//Excelent!!
$items[] = $match[1];
} else {
//Ups! not found!
}
?>
5 réponses
Dans ce post, je vais vous fournir avec trois méthodes différentes de faire ce que vous demandez. Je recommande en fait d'utiliser le dernier extrait, car il est plus facile à comprendre ainsi que d'être assez soigné dans le code.
Comment puis-je voir quels éléments dans un tableau qui correspondent à mon expression régulière?
Il y a une fonction dédiée à cette fin, preg_grep
. Il prendra une expression régulière comme premier paramètre, et un tableau comme deuxième.
Voir l'exemple ci-dessous:
$haystack = array (
'say hello',
'hello stackoverflow',
'hello world',
'foo bar bas'
);
$matches = preg_grep ('/^hello (\w+)/i', $haystack);
print_r ($matches);
sortie
Array
(
[1] => hello stackoverflow
[2] => hello world
)
Documentation
Mais je veux juste obtenir la valeur de l'groupes spécifiés. Comment?
array_reduce
preg_match
peut résoudre ce problème de manière propre; voir l'extrait dessous.
$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);
sortie
Array
(
[0] => stackoverflow
[1] => world
)
Documentation
en utilisant array_reduce
semble fastidieux, n'est-il pas un autre moyen?
Oui, et celui-ci est effectivement plus propre que ce n'est pas impliquer l'utilisation de tous les pré-existantes array_*
ou preg_*
fonction.
l'Envelopper dans une fonction si vous allez utiliser cette méthode plusieurs fois.
$matches = array ();
foreach ($haystack as $str)
if (preg_match ('/^hello (\w+)/i', $str, $m))
$matches[] = $m[1];
Documentation
Vous pouvez utiliser array_walk
pour appliquer votre preg_match
fonction à chaque élément du tableau.
$items = array();
foreach ($haystacks as $haystack) {
if (preg_match($pattern, $haystack, $matches)
$items[] = $matches[1];
}
$haystack = array (
'say hello',
'hello stackoverflow',
'hello world',
'foo bar bas'
);
$matches = preg_grep ('/hello/i', $haystack);
print_r ($matches);
Sortie
Array
(
[1] => say hello
[2] => hello stackoverflow
[3] => hello world
)