preg_match_all
(PHP 4, PHP 5)
preg_match_all — Expression rationnelle globale
Description
$pattern
, string $subject
[, array &$matches
[, int $flags
= PREG_PATTERN_ORDER
[, int $offset
= 0
]]] )
Analyse subject
pour trouver l'expression
pattern
et met les résultats dans
matches
, dans l'ordre spécifié par
flags
.
Après avoir trouvé un premier résultat, la recherche continue jusqu'à la fin de la chaîne.
Liste de paramètres
-
pattern
-
Le masque à chercher, sous la forme d'une chaîne de caractères.
-
subject
-
La chaîne d'entrée.
-
matches
-
Tableau contenant tous les résultats, dans un tableau multidimensionnel ordonné suivant le paramètre
flags
. -
flags
-
Peut prendre une des deux valeurs suivantes (notez bien qu'il est incohérent d'utiliser
PREG_PATTERN_ORDER
avecPREG_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.
<?php preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>exemple : </b><div align=left>ceci est un test</div>", $out, PREG_PATTERN_ORDER); echo $out[0][0] . ", " . $out[0][1] . "\n"; echo $out[1][0] . ", " . $out[1][1] . "\n"; ?>
L'exemple ci-dessus 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ésultats, $matches[1] contient la deuxième, etc.
<?php preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>exemple : </b><div align=\"left\">ceci est un test</div>", $out, PREG_SET_ORDER); echo $out[0][0] . ", " . $out[0][1] . "\n"; echo $out[1][0] . ", " . $out[1][1] . "\n"; ?>
L'exemple ci-dessus va afficher :
<b>exemple : </b>, exemple : <div align="left">ceci est un test</div>, ceci est un test
-
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 et l'index de celle-ci dans la chaîne
subject
à l'index 1.
Si
order
est omis,PREG_PATTERN_ORDER
est utilisé par défaut. -
-
offset
-
Normalement, la recherche commence au début de la chaîne
subject
. Le paramètre optionneloffset
peut être utilisé pour spécifier une position pour le début de la recherche (en octets).Note:
Utiliser le paramètre
offset
ne revient pas à passer substr($subject, $offset) à preg_match_all() à la place de la chaînesubject
, carpattern
peut contenir des assertions comme ^, $ ou (?<=x). Lisez la documentation sur la fonction preg_match() pour des exemples.
Valeurs de retour
Retourne le nombre de résultats qui satisfont le masque
complet, ou FALSE
si une erreur survient.
Historique
Version | Description |
---|---|
5.4.0 |
Le paramètre matches devient optionnel.
|
5.3.6 |
Retourne FALSE si offset est plus grand que
la taille de subject .
|
5.2.2 | Les sous-masques nommés acceptent maintenant les syntaxes (?<name>), (?'name') ainsi que (?P<name>). Les précédentes versions n'acceptaient que la syntaxe (?P<name>). |
4.3.3 |
Le paramètre offset a été ajouté.
|
4.3.0 |
Le drapeau PREG_OFFSET_CAPTURE a été ajouté.
|
Exemples
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", "Call 555-1212 or 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 quelque chose 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="/manuel-php/;
preg_match_all(" data-lbox="1" title="Manuel PHP - ]*>)(.*?)()/", $html, $matches, PREG_SET_ORDER);
foreach ($matches as $val) {
echo "matched: " . $val[0] . "\n";
echo "part 1: " . $val[1] . "\n";
echo "part 2: " . $val[2] . "\n";
echo "part 3: " . $val[3] . "\n";
echo "part 4: " . $val[4] . "\n\n";
}
?>