7.89.9.1 Détails sur les expressions régulières
7.89.9 syntaxe des masques
7.89 Expressions régulières compatibles Perl
7 Index des fonctions
Manuel PHP
. Introduction . Méta-caractères . Antislash . Accent circonflexe et Dollar . Point . Crochets . Barre verticale . Options internes . Sous-masques . Répétitions . Références arrières . Assertions . Sous-masques uniques . Les sous-masques conditionnels . Commentaires ->Masques récursifs . Performances
|
Masques récursifs
Considérons le cas où il faut recherche dans une
chaîne, avec un niveau d'imbrications infini de
parenthèses. Sans l'aide de la récursivité, le
mieux que nous puissions obtenir est de créer un masque avec un
niveau fixé de profondeur d'imbrication. Il n'est pas possible
de traiter des masques à niveau d'imbrications variable.
PCRE fournit un nouvel outil expérimental qui permet
d'utiliser la récursivité dans les masques (entre autre).
L'option
(?R)
est fournie pour servir la cause de
la récursivité. Le masque suivant résoud le
problème des parenthèses (l'option
PCRE_EXTENDED est
utilisée pour ignorer les espaces) :
\( ( (?>[^()]+) | (?R) )* \)
Tout d'abord, le masque recherche une parenthèse ouvrante. Puis,
il recherche n'importe quel nombre de sous-chaînes qui sont soit
des séquences de caractères non-parenthèses, ou
bien une recherche récursive avec le même masque (i.e.
une chaîne correctement incluse entre parenthèses).
Finalement, il recherche une parenthèse fermante.
Cet exemple particulier contient un nombre illimité de
répétitions imbriquées, ce qui fait que
l'utilisation de sous-chaînes à utilisation unique
pour rechercher les séquence de caractères
non-parenthèses est important, lorsqu'il s'applique à
une chaîne qui n'est pas valide. Par exemple, si on l'applique
à "
(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
"
la réponse arrive rapidement. Sinon, si les sous-chaînes
à utilisation unique ne sont pas utilisées, la
recherche peut prendre un très long temps, car il existe
de très nombreuses combinaisons de
+
et
*
à tester avant de conclure à
l'échec.
Les valeurs utilisées pour capturer les sous-masques sont celles
utilisées par les niveaux les plus hauts de
récursivités, auquel la valeur est fixée.
Si le masque précédent est utilisé avec
(ab(cd)ef)
la valeur de la parenthèse
capturante est "
ef
", qui est la dernière
valeur lue au niveau supérieur. Si de nouvelles
parenthèses sont ajoutées, par exemple :
\( ( ( (?>[^()]+) | (?R) )* ) \)
alors la chaîne capturée est "
ab(cd)ef
",
c'est-à-dire le contenu de la parenthèses capturant
de plus haut niveau. S'il y a plus de 15 parenthèses
capturantes dans une chaîne, PCRE doit utiliser plus
de mémoire pour stocker ces données. S'il ne
peut obtenir cette mémoire supplémentaire, il ne fait
que sauver les 15 premières, car il n'y a pas moyen de
générer une erreur de mémoire lors d'une
récursion.
|