Manuel PHP
Précédent |  | Suivant

# preg_match_all

(PHP 3>= 3.0.9, PHP 4 , PHP 5)

preg_match_all -- Expression régulière globale

## Description

int preg_match_all ( string pattern, string subject, array matches [, int flags [, int offset]])

preg_match_all() analyse `subject` pour trouver l'expression `pattern` et met les résultats dans `matches`, dans l'ordre spécifié par `order`.

Après avoir trouvé un premier résultat, la recherche continue jusqu'à la fin de la chaîne.

`order` peut prendre une des deux valeurs suivantes (notez bien qu'il est incohérent d'utiliser `PREG_PATTERN_ORDER` avec `PREG_SET_ORDER` ) :

`PREG_PATTERN_ORDER`

  L'ordre est tel que $matches[0] est un tableau qui contient les résultats qui satisfont le masque complet, $matches[1] est un tableau qui contient les résultats qui satisfont la première parenthèse capturante, etc..

  Exemple 1. Exemple avec preg_match_all() et `PREG_PATTERN_ORDER`

  `<?php preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>exemple : </b><div align=left>un test</div>", $out, PREG_PATTERN_ORDER); print $out[0][0].", ".$out[0][1]."\n"; print $out[1][0].", ".$out[1][1]."\n"; ?>`

  Cet exemple va afficher :

  Exemple 2. Resultat avec `PREG_PATTERN_ORDER` `<b>exemple : </b>, <div align=left>un test</div> exemple : , un test`

  Ainsi, $out[0] est un tableau qui contient les résultats qui satisfont le masque complet, et $out[1] est un tableau qui contient les balises entre > et <.
`PREG_SET_ORDER`

  Les résultats sont classés de telle façon que $matches[0] contient la première série de résultat, $matches[1] contient la deuxième série de résultat, etc...

  Exemple 3. Exemple avec preg_match_all() et `PREG_SET_ORDER`

  `<?php preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>exemple : </b><div align=left>un test</div>", $out, PREG_SET_ORDER); print $out[0][0].", ".$out[0][1]."\n"; print $out[1][0].", ".$out[1][1]."\n"; ?>`

  Cet exemple va afficher :

  Exemple 4. Résultat avec `PREG_SET_ORDER`

  `<b>exemple : </b>, exemple : <div align=left>un test</div>, un test`

  Dans ce cas, $matches[0] est la première série de résultat, et $matches[0][0] contient le texte qui satisfait le masque complet, $matches[0][1] contient le texte de la première parenthèse capturante, etc... De même, $matches[1] contient le texte qui satisfait le masque complet, etc...
`PREG_OFFSET_CAPTURE`

  Si cette option est activée, toutes les sous chaînes qui satisfont le masque seront aussi identifiées par leur offset. Notez que cela modifie le format de la valeur retournée , puisque chaque élément de réponse devient un tableau contenant la sous-chaîne résultat, à l'index `0` dans la chaîne `subject` constant `1`. Cette option a été ajoutée en `PHP` 4.3.0 .

Si `order` est omis, PREG_PATTERN_ORDER est utilisé par défaut.

preg_match_all() retourne le nombre de résultat qui satisfont le masque complet, ou `FALSE` en cas d'échec ou d'erreur.

Exemple 5. Extraction de tous les numéros de téléphone d'un texte.

`<?php preg_match_all("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x", "Appelez 555-1212 ou 1-800-555-1212", $phones); ?>`

Exemple 6. Recherche les couples de balises HTML (gourmand)

`<?php
// Cet exemple utilise les références arrières (\\2).
// Elles indiquent à l'analyseur qu'il doit trouver quelquechose qu'il
// a déjà repéré un peu plus tôt
// le nombre 2 indique que c'est le deuxième jeu de parenthèses
// capturante qui doit être utilisé (ici, ([\w]+)).
// L'antislash est nécessaire ici, car la chaîne est entre guillemets doubles
$html = "<B>Texte en gras</B><a href=salut.html>clique moi</a>";
preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);
for ($i=0; $i< count($matches[0]); $i++) {
echo "Trouvé : ".$matches[0][$i]."\n";
echo "partie 1 : ".$matches[1][$i]."\n";
echo "partie 2 : ".$matches[3][$i]."\n";
echo "partie 3 : ".$matches[4][$i]."\n\n";
}
?>`

Cet exemple va produire : `Trouvé : <B>Texte en gras</B> partie 1 : <B> partie 2 : Texte en gras partie 3 : </B> Trouvé : <a href=salut.html>clique moi</a> partie 1 : <a href=salut.html> partie 2 : clique moi partie 3 : </a>`

Voir aussi preg_match(), preg_replace() et preg_split().

Précédent | Sommaire | Suivant
preg_grep | Niveau supérieur | preg_match