Google

NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.73 ">

preg_match_all

(PHP 3>= 3.0.9, PHP 4 )

preg_match_all -- Expression régulière globale.

Description

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

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 :

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

<?php
preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>example: </b><div align=left>a 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 :


    <b>exemple: </b>, <div align=left>ceci est un test</div> exemple: , ceci est 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...

<?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 :


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

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 1. 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 2. 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</?>
preg_match_all ("/(<([\w]+)[?>]?>)(.*)(<\/\\?>)/", $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>bold text</?> partie 1: <B> partie 2: Test en gras partie 3: </B> trouvé: <a href=salut.html>clique moi</?> partie 1: <a href=salut.html> partie 2: clique moi partie 3: </?>

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