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.

syntaxe d'une expression régulière

Les options les plus utiles :

- i : rend insensible à la casse
- s : le point reconnaît les sauts de ligne
- m : la chaîne est multilignes
- e : du code PHP peut être évalué dans le remplacement
- U : rend tous les quantificateurs non gourmands
- x : permet de commenter les modèles

### Insensible à la casse

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

Exemple : option i
<?php require('bib_fonctions.php'); htmlDebut('Option i'); $txt = "Les expressions réguliéres sont LES armes de la Force et brisent leS chaînes"; htmlInfo('Tous les "les", insensibles à la casse'); $exp = '/les/i'; testerExp($exp, $txt); htmlFin(); ?>

### Point et saut de ligne

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

Exemple : options s
<?php require('bib_fonctions.php'); htmlDebut('Options s'); $txt = 'Ecrire à <a href="mailto: vador@lesmechants.com">Dark Vador</a><br> Ecrire à <a href="mailto:yoda@ lesgentils.com">Yoda</a>'; htmlInfo('Gestion des sauts de ligne'); $exp = '/"mailto:.*?"/s'; testerExpHtml($exp, $txt); htmlFin(); ?>

Pour bien voir la différence, enlevez l'option de l'expression régulière.

### Multiligne

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.

Exemple : option m
<?php require('bib_fonctions.php'); htmlDebut('Option m'); $txt = "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"; htmlInfo('Les lignes dont le titre contient JEDI'); $exp = '/^\d+;[^;]+;[^;]*JEDI[^;]*;.*/'; testerExp($exp, $txt); htmlFin(); ?>

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.

Exemple : options m
<?php require('bib_fonctions.php'); htmlDebut('Option m'); $txt = "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"; htmlInfo('Les lignes dont le titre contient JEDI'); $exp = '/^\d+;[^;]+;[^;]*JEDI[^;]*;.*/m'; testerExp($exp, $txt); htmlFin(); ?>

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

### Evaluation de code

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.

### Expression non gourmande

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.

### Commentaires

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

### Autres options

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.