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
|
Assertions
Une assertion est un test sur les caractères suivants ou
précédent celui qui est en cours d'étude. Ce
test ne consomme par de caractère (ie, on ne déplace
pas le pointeur de caractères). Les assertions simples sont
codées avec
\b
,
\B
,
\A
,
\Z
,
\z
,
^
et
$
, et sont décrites
précédemment.
Il existe cependant un type d'assertions plus complexes, codées
sous la forme de sous-masques. Il en existe deux types : celles qui
travaillent au-delà de la position courante (
\w+(?=;)
),
et celles qui travaillent en deça (
(?!)\w+
).
Une assertion se comporte comme un sous-masque, hormis le fait qu'elle
ne déplace pas le pointeur de position. Les assertions avant
commencent par
(?=
pour les assertions positives, et
par
(?!
, pour les assertions négatives. Par exemple :
\w+(?=;)
s'assure qu'un mot est suivi d'un point-virgule,
mais n'inclus pas le point virgule dans la capture. D'autre part,
(?!foo)bar
en est proche, mais ne trouve pas une
occurrence de "
bar
" qui soit précédée
par quelque chose d'autre que "
foo
foo"; il trouve toutes
les occurrences de "
bar
", quelque soit ce qui
le précéde, car l'assertion
(?!foo)
est toujours vraie quand les trois caractères suivants sont
"
bar
". Une assertion arrière est ici
nécessaire.
Les assertions arrières commencent par
(?<=
pour les assertions positives, et
(?<!
pour les
assertions négatives. Par exemple :
(?<!foo)bar
trouve les occurrences de "
bar
" qui ne sont pas
précédées par "
foo
".
Le contenu d'une référence arrière est limité
de telle façon que les chaînes qu'il utilise
soient toujours de la même taille. Cependant, lorsqu'il
y a plusieurs alternatives, elles n'ont pas besoin d'être
de la même taille. Par exemple,
(?<=bullock|donkey)
est autorisé, tandis que
(?<!dogs?|cats?)
provoque une erreur de compilation. Les alternatives qui ont des
longueurs différentes ne sont autorisées qu'au niveau
supérieur des assertions arrières. C'est une
amélioration du fonctionnement de Perl 5.005, qui impose
aux alternatives d'avoir toutes la même taille. Une
assertion telle que
(?<=ab(c|de))
n'est pas
autorisée, car l'assertion de bas niveau (la deuxième,
ici) a deux alternatives de longueurs différentes. Pour
la rendre acceptable, il faut écrire
(?<=abc|abde)
L'implémentation des assertions arrières déplace
temporairement le pointeur de position vers l'arrière, et cherche
à vérifier l'assertion. Si le nombre de caractères
est différent, la position ne sera pas correcte, et l'assertion
échouera. La combinaison d'assertions arrières avec des
sous-masques peut être particulièrement pratique à
fin des chaînes. Un exemple est donné à la fin de
cette section.
Plusieurs assertions peuvent intervenir successivement. Par exemple,
le masque
(?<=\d{3})(?<!999)foo
recherche
les chaînes "
foo
" précédées
par trois chiffres qui ne sont pas "999". Notez que chaque assertion
est appliquées indépendemment, au même point de
la chaîne à traiter. Tout d'abord, il est
vérifié que les trois premiers caractères ont
tous des chiffres, puis on s'assure que ces trois caractères
ne sont pas "
999
". Le masque précédant
n'accepte pas "
foo
" précédé de
6 caractères, les trois premiers étant des chiffres et
les trois suivants étant différents de "
999
".
Par exemple, ce masque n'acceptera pas la chaîne
"
123abcfoo
". Pour ce faire, il faut utiliser le masque
suivant :
(?<=\d{3}...)(?<!999)foo
. Dans ce
masque, la première assertion vérifie les six premiers
caractères, s'assure que les trois premiers sont des entiers,
et la deuxième assertion s'assure que les trois derniers
caractères ne sont pas "
999
".
De plus, les assertions peuvent être imbriquées :
(?<=(?<!foo)bar)baz
recherche les
occurrences de "
baz
" qui sont
précédées par "
bar
", qui,
à son tour, n'est pas précédé par
"
foo
". Au contraire,
(?<=\d{3}(?!999)...)foo
est un autre masque,
qui recherche les caractères "
foo
",
précédés par trois chiffres, suivis trois
autres caractères qui ne forment pas "
999
".
Les assertions ne sont pas capturantes, et ne peuvent pas être
répétées. Si une assertion contient des sous-masques
capturants en son sein, ils seront compris dans le nombre de sous-masques
capturants du masque entier. La capture est réalisée pour
les assertions positives, mais cela n'a pas de sens pour les
assertions négatives.
200 assertions au maximum sont autorisées.
|