Il est possible de modifier le comportement d'une expression régulière en utilisant des options (ou modificateurs) qui se placent derrière le délimiteur de fin de modèle.
Les options peuvent être multiples : il suffit de les indiquer les unes à la suite des autres, sans aucun spérateur.
Les options les plus utiles :
Cette option force l'expression régulière à ne pas tenir compte des différences majuscules/ minuscules dans sa recherche ou son remplacement.
Soit le texte "Les expressions réguliéres sont LES armes de la Force
et brisent leS chaînes". Si nous voulons récupèrer tous les "les",
nous aurons l'expression :
/les/i
Nous avons vu que le point (.) est un "joker" qui remplace n'importe quel caractère ... sauf le saut de ligne (retour chariot). Si vous travaillez sur des chaînes qui peuvent contenir des sauts de ligne, vos expressions régulières utilisant le point (.) risque de ne pas fonctionner correctement.
Quand nous avons étudié les quantificateurs non gournamnds, nous avons utilisé comme exemple la recherche d'adresse e-mail dans du code HTML :
Ecrire à <a href="mailto:vador@lesmechants.com">Dark
Vador</a><br>
Ecrire à <a
href="mailto:yoda@lesgentils.com">Yoda</a>
Avec l'expression régulière /"mailto:.*?"/ nous pouvions récupèrer les 2 e-mails du
texte.
Mais que se passe-t-il si le texte contient par
exemple des sauts de ligne comme ci-dessous :
Ecrire à <a href="mailto:
vador@lesmechants.com">Dark
Vador</a><br>
Ecrire à <a href="mailto:yoda@
lesgentils.com">Yoda</a>
Le parseur du navigateur HTML n'aura pas de problème pour gérer
correctement ces sauts de ligne, puisqu'il est construit de façon à
les ignorer. Par contre notre expression régulière ne fonctionnera
pas tant que nous n'aurons pas ajouté l'option s :
/"mailto:.*?"/s
Pour bien voir la différence, enlevez l'option de l'expression régulière.
Les assertions de début et fin de ligne (^ et $) sont très interressantes car elles accélèrent beaucoup le traitement des expressions régulières. Pourtant quand la chaîne à traiter est multiligne, ce qui arrive souvent quand on traite des fichiers, l'ancrage de début se trouvera avant le premier caractère de la chaîne (ie première ligne du fichier), et l'ancrage de fin se trouvera après le dernier caractère de la chaîne (ie dernière ligne du fichier). Les assertions ne nous seront alors pas d'une grande utilité.
Imaginons un fichier exporté à partir d'Excel (ou de n'importe quel logiciel qui fasse de l'export CSV - Comma Separated Value). Le fichier contient une liste de livres (oui, ayant trait à Star Wars, mais comment avez-vous deviné ?). Chaque ligne du fichier est composée de 4 champs séparés par des point-virgules(;) : un numéro, un nom de série, un titre, un auteur.
1042;ACADEMIE JEDI;1 LA QUETE DES JEDI;KEVIN J. ANDERSON
1043;ACADEMIE JEDI;2 SOMBRE DISCIPLE;KEVIN J. ANDERSON
1044;ACADEMIE JEDI;3 LES CHAMPIONS DE LA FORCE;KEVIN J. ANDERSON
1013;FILM;EPISODE I : LA MENACE FANTOME;TERRY BROOKS
1014;EPISODE I : JOURNAL;AMIDALA;JUDE WATSON
1015;EPISODE I
: JOURNAL;PLANETE REBELLE;GREG BEAR
1016;FILM;EPISODE II :
L'ATTAQUE DES CLONES;R.A. SALVATORE
1017;FILM;EPISODE II
(VERSION JUNIOR);PATRICIA C. WREDE
1022;FILM;EPISODE IV :
UN NOUVEL ESPOIR;GEORGE LUCAS
1023;FILM;EPISODE V :
L'EMPIRE CONTRE-ATTAQUE;DONALD F. GLUT
1024;FILM;LES OMBRES
DE L'EMPIRE;STEVE PERRY
1025;FILM;EPISODE VI : LE RETOUR DU
JEDI;JAMES KAHN
1038;LE JEDI FOU;1 L'HERITIER DE
L'EMPIRE;TIMOTHY ZAHN
1039;LE JEDI FOU;2 LA BATAILLE DES
JEDI;TIMOTHY ZAHN
1040;LE JEDI FOU;3 L'ULTIME
COMMANDEMENT;TIMOTHY ZAHN
1045;-;LES ENFANTS DU
JEDI;BARBARA HAMBLY
1046;-;LE SABRE NOIR;KEVIN J. ANDERSON
1047;-;LA PLANETE DU CREPUSCULE;BARBARA HAMBLY
1059;JEUNES
CHEVALIERS JEDI;1 LES ENFANTS DE LA FORCE;ANDERSON
1060;JEUNES CHEVALIERS JEDI;2 LES CADETS DE L'OMBRE;ANDERSON
1061;LES JEUNES CHEVALIERS JEDI;3 GENERATION PERDUE;ANDERSON
1062;JEUNES CHEVALIERS JEDI;4 LES SABRES DE LUMIERE;ANDERSON
1063;JEUNES CHEVALIERS JEDI;5 LE CHEVALIER DE LA NUIT;ANDERSON
1076;LES AGENTS DU CHAOS;1 LA COLERE DU HEROS;JAMES LUCENO
1077;LES AGENTS DU CHAOS;2 L'ECLIPSE DES JEDI;JAMES LUCENO
Si nous voulons rechercher les lignes dont le champ titre contient
le mot JEDI, nous pourrions utiliser l'expression régulière :
/^\d+;[^;]+;[^;]*JEDI[^;]*;.*/
L'ancrage ^ en début d'expression permet d'écrire un modèle
décomposant une ligne en champs séparés par des point-virgules, et
de recherche le mot JEDI dans le troisième champ.
En testant nous voyons que seule la première ligne a été trouvée, et
que celles plus loin dans le fichier ont été ignorées. Si nous
ajoutons l'option m à l'expression :
/^\d+;[^;]+;[^;]*JEDI[^;]*;.*/m
nous demandons alors à ce que
chaque saut de ligne soit considéré comme une fin de chaîne et le
début de la suivante, mettant ainsi des ancrages ^ à tous les débuts
de lignes, et non plus seulement au début de la première ligne du
fichier.
En ajoutant l'option m, nous trouvons bien 5 lignes contenant le mot JEDI dans le champ titre.
Les options peuvent être cumulées. Par exemple, nous
pourrions ajouter l'option i pour ignorer la casse et avoir
l'expression régulière suivante :
/^\d+;[^;]+;[^;]*jedi[^;]*;.*/mi
L'option e permet d'utiliser dans une expression régulière une fonction PHP ou personnelle. Cette option n'est utilisable que dans une expression qui va servir à faire un remplacement. L'expression va permettre de capturer des éléments recherchés, de les passer en argument à la fonction qui va les traiter et renvoyer le résultat du traitement comme élément de remplacement. Nous étudierons plus en détail cette fonctionnalité dans la page suivante relative aux fonctions PHP gérant les expressions régulières.
Nous avons vu précédemment comment rendre un quantificateur non gourmand. L'option U (U majuscule - Ungreedy)rend tous les quantificateurs d'une expression non gourmands.
/<a href="(.*?)">(.*?)<\/a>/
et
/<a
href="(.*)">(.*)<\/a>/U
sont équivalents.
Avec l'option x, tous les caractères d'espacement sont ignorés, sauf
si ils sont dans une classe ou echappé. Tous les caractères après un
# (non echappé et en dehors d'une classe) sont ignorés jusqu'à une
nouvelle ligne.
En clair l'option x permet de mettre des
commentaires dans une expression régulière :
/^\d+;[^;]+;[^;]*JEDI[^;]*;.*/m
est équivalent à :
/ # Délimiteur de l'expression
^ # ancrage de début de chaîne
\d+; # caractère décimal 1 fois ou + suivi d'un ;
[^;]+; # tout caractère sauf ; 1 fois ou + suivi d'un ;
[^;]* # tout caractère sauf ; 0 fois ou +
JEDI # suivi du mot JEDI
[^;]*; #
tout caractère sauf ; 0 fois ou + suivi d'un ;
.* # tout caractère sauf saut de ligne
0 fois ou +
/mx
Il existe d'autres options, beaucoup moins utilisées.
- Extraits de la doc -
A Avec cette option, le masque est ancré de force, c'est-à-dire que le masque doit s'appliquer juste au début de la chaîne sujet pour être considéré comme trouvé.
D Avec cette option, le méta-caractère $ ne sera valable qu'à la fin de la chaîne sujet. Sans cette option, $ est aussi valable avant une nouvelle ligne, si cette dernière est le dernier caractère de la chaîne. Cette option est ignorée si l'option m est activée.
S Lorsqu'un masque est utilisé plusieurs fois, cela vaut la peine de passer quelques instants de plus pour l'analyser et optimiser le code pour accélérer les traitements ultérieurs. Cette option force cette analyse plus poussée. Actuellement, cette analyse n'est utile que pour les masques non ancrés, qui ne commencent pas par un caractère fixe.
X Tous les anti-slash suivis d'une lettre qui n'aurait pas de signification particulière cause une erreur, permettant la réservation de ces combinaisons pour des ajouts fonctionnels ultérieurs. Par défaut, comme en Perl, les anti-slash suivis d'une lettre sans signification particulière sont traités comme des valeurs littérales
u Cette option désactive les fonctionnalités additionnelles qui ne sont pas compatibles avec Perl. Les chaînes sont traitées comme des chaînes UTF-8. Cette option est disponible en PHP 4.1.0 et plus récent sur plate-forme Unix et en PHP 4.2.3 et plus récent sur plate-forme Windows.