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 flags.
preg_match_all() retourne le nombre de fois où le masque pattern a été trouvé. Après avoir trouvé un premier résultat, la recherche continue jusqu'à la fin de la chaîne.
preg_match_all() retourne FALSE si une erreur survient.
| Valeur possible |
Action |
|---|---|
| PREG_PATTERN_ORDER (par défaut) | 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. |
| 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. |
| 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. |
Dans cet exemple, on recherche la patterns entre "/" et "/" et l'on retourne le nombre de fois qu'il est trouvé.
<?php
$subject = 'Ceci est un test';
$nb_match = preg_match_all("/e/", $subject, $matches);
echo "$nb_match est le nombre de (e) dans \"$subject\".";
?>
Ce qui retourne :
3 est le nombre de (e) dans "Ceci est un test".
Autre exemple, pour trouver et lire un texte entre les balises > et <, avec comme flags "PREG_PATTERN_ORDER".
<?php
$subject = '<p>Ceci est un test</p><p style="color:red;"> avec PREG_MATCH_ALL()</p>';
preg_match_all("|<[^>]+>(.*)</[^>]+>|U", $subject, $matches, PREG_PATTERN_ORDER);
echo '<p>$matches[0][0] = "'.htmlspecialchars($matches[0][0]).'"</p>';
echo '<p>$matches[0][1] = "'.htmlspecialchars($matches[0][1]).'"</p>';
echo '<p>$matches[1][0] = "'.htmlspecialchars($matches[1][0]).'"</p>';
echo '<p>$matches[1][1] = "'.htmlspecialchars($matches[1][1]).'"</p>';
?>
Ce qui retourne :
$matches[0][0] = "<p>Ceci est un test</p>"
$matches[0][1] = "<p style="color:red;"> avec PREG_MATCH_ALL()</p>"
$matches[1][0] = "Ceci est un test"
$matches[1][1] = " avec PREG_MATCH_ALL()"
Autre exemple, pour trouver et lire un texte entre les balises > et <, avec comme flags "PREG_SET_ORDER".
<?php
$subject = '<p>Ceci est un test</p><p style="color:red;"> avec PREG_MATCH_ALL()</p>';
preg_match_all("|<[^>]+>(.*)</[^>]+>|U", $subject, $matches, PREG_SET_ORDER);
echo '<p>$matches[0][0] = "'.htmlspecialchars($matches[0][0]).'"</p>';
echo '<p>$matches[0][1] = "'.htmlspecialchars($matches[0][1]).'"</p>';
echo '<p>$matches[1][0] = "'.htmlspecialchars($matches[1][0]).'"</p>';
echo '<p>$matches[1][1] = "'.htmlspecialchars($matches[1][1]).'"</p>';
?>
Ce qui retourne :
$matches[0][0] = "<p>Ceci est un test</p>"
$matches[0][1] = "Ceci est un test"
$matches[1][0] = "<p style="color:red;"> avec PREG_MATCH_ALL()</p>"
$matches[1][1] = " avec PREG_MATCH_ALL()"