Manuel PHP
Précédent |  | Suivant

# 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().

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