2009-10-20 7 views
1

Hy les gars!preg_match_all imprimer * tous les * matchs

J'ai besoin d'imprimer toutes les correspondances en utilisant preg_match_all.

$search = preg_match_all($pattern, $string, $matches); 

foreach ($matches as $match) { 
    echo $match[0]; 
    echo $match[1]; 
    echo $match[...]; 
} 

Le problème est que je ne sais pas combien de matchs il dans ma chaîne, et même si je savais et si elle était de 1000 qui serait assez stupide pour saisir tous ces $match[] « s. Je réalise que c'est un truc de base, mais je suis en train d'apprendre.

Merci pour tous les conseils.

Répondre

6

Le $match[0], $match[1], etc., les éléments ne sont pas les matchs individuels, ils sont les "captures". Le nombre d'entrées dans $matches est constant, parce qu'il est basé sur ce que vous recherchez pour, pas les résultats. Il y a toujours au moins une entrée, plus une de plus pour chaque paire de parenthèses de capture dans le motif de recherche.

Par exemple, si vous faites:

$matches = array(); 
$search = preg_match_all("/\D+(\d+)/", "a1b12c123", $matches); 
print_r($matches); 

Matches auront seulement deux points, même si trois matches ont été trouvés. $matches[0] sera un tableau contenant "a1", "b12" et "c123" (la correspondance complète pour chaque élément) et $matches[1] ne contiendra que la première capture pour chaque élément, à savoir "1", "12" et "123" .

Je pense que ce que vous voulez est quelque chose comme:

foreach ($matches[1] as $match) { 
    echo $match; 
} 

qui imprimera la première expression de capture de chaque chaîne assortie.

0

Vous pouvez effectuer une boucle récursive. Cet exemple nécessite SPL et PHP 5.1+ via RecursiveArrayIterator:

foreach(new RecursiveArrayIterator($matches) as $match) 
    print $match;