Les options PCRE_CASELESS,
PCRE_MULTILINE,
PCRE_DOTALL,
PCRE_UNGREEDY,
PCRE_EXTRA,
PCRE_EXTENDED et
PCRE_DUPNAMES peuvent être changées à l'intérieur du masque
lui-même, avec des séquences mises entre
"(?
" et ")
".
Les options sont :
i |
pour PCRE_CASELESS |
m |
pour PCRE_MULTILINE |
s |
pour PCRE_DOTALL |
x |
pour PCRE_EXTENDED |
U |
pour PCRE_UNGREEDY |
X |
Pour PCRE_EXTRA (plus supporté à partir de PHP 7.3.0) |
J |
Pour PCRE_INFO_JCHANGED |
Par exemple, (?im)
rend le masque insensible à
la casse, et multilignes. Il est possible d'annuler ces options en les
faisant précéder par un signe -
: par
exemple (?im-sx)
, ajoutera les options
PCRE_CASELESS
et PCRE_MULTILINE,
mais annulera les options
PCRE_DOTALL
et PCRE_EXTENDED.
Si une option apparaît avant et après le signe moins, l'option
sera annulée.
Lorsqu'une modification d'option survient au degré le plus haut (et donc, pas dans
les parenthèses du sous-masque), les modifications sont appliquées dans le reste
du masque qui suit. Donc, /ab(?i)c/
valide uniquement
"abc" et "abC".
Si une option intervient dans un sous-masque, le comportement est différent.
C'est un changement de comportement apparu en Perl 5.005. Une option à
l'intérieur d'un sous-masque n'affecte que cette partie du masque, ce
qui fait que (a(?i)b)c
acceptera abc
et aBc
,
mais aucune autre chaîne (en supposant que PCRE_CASELESS n'est pas
utilisé). Cela signifie que les options permettent d'avoir
différentes configurations de recherche pour différentes parties du masque.
Une séquence d'options dans une alternative affecte toute l'alternative.
Par exemple :
(a(?i)b|c)
accepte "ab
", "aB
", "c
",
et "C
", même si, comme dans le cas de
"C
", la première alternative qui porte
l'option n'est pas prise en compte. Sinon, cela risque d'introduire
des comportements très étranges
Les options spécifiques à PCRE telles
PCRE_UNGREEDY et
PCRE_EXTRA peuvent
être modifiées de la même manière, en utilisant respectivement les caractères
U et X. L'option (?X)
est particulière,
car elle doit toujours intervenir avant toutes les autres options,
même au niveau du masque entier. Il vaut mieux l'activer au
début du masque.