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!
}
?>
39
demandé sur Olaf Erlandsen 2011-12-25 03:01:35

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_reducepreg_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

124
répondu Filip Roséen - refp 2012-10-17 15:11:51

Utiliser preg_grep

$array = preg_grep(
    '/(my\n+string\n+)/i',
    array( 'file' , 'my string  => name', 'this')
);
4
répondu Galen 2011-12-24 23:04:58

Vous pouvez utiliser array_walk pour appliquer votre preg_match fonction à chaque élément du tableau.

http://us3.php.net/array_walk

3
répondu Logan Serman 2011-12-24 23:03:19
$items = array();
foreach ($haystacks as $haystack) {
    if (preg_match($pattern, $haystack, $matches)
        $items[] = $matches[1];
}
2
répondu goat 2011-12-24 23:10:22
$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
)
0
répondu Mahdi Bashirpour 2018-08-08 11:47:31