expressions régulières
description
Transcript of expressions régulières
Pour les débutonts
Exp ressi o ns rég u I i è res
Les expressions régulières sont des outils puissonts de monipulotion de choînesde coroctères. Elles permettent de vérifier lo présence d.e.çnotifs dons une choîne,d'extroire des portions de texte et d'en remplocer des.porties. Une fois que vousourez compris le principe et oppris à vous en servir en PHP, vous pourrez lesutiliser à tous les niveoux de I'orchitecture d'une opplicotion web.
Cet ort icle expl ique :. Comment créer une expression régul ière,. Comment rechercher lo présence d 'un mot i f
dons une choîne de coroctères,. Comment extro i re des port ions de texte et rem-
plocer des port ies d 'un texte.
Ce qu' i l fout sovoi r :. Vous devez connoît re les boses du longoge
PHP.
s'effectue caractère par caractère, de la gauche
vers la droite à partir du premier caractère de la
chaîne. La première correspondance trouvée se-
ra donc celle qui se situe le plus à gauche dans la
chaîne. Dans I'exemple précédent, I'expression
régulière jour reconnaît la sous-chaîne " jour"
du mot "Bon jou r " .
L'utilisation d'expressions régulières pour
rechercher un texte littéral n'est cependant
pas très intéressante et il existe des fonctions
PHP spécifiques plus efficaces pour ce type
de recherche [la section intitulée Utiliser les
expressions régtlieres à bon escient présente ces
fonctions).
Représenter un coroctère quelconque
Le caractère spécial point représente un carac-
tère quelconque dans la chaîne. Il peut s'agir
d'une lettre, d'un chiffre, d'un élément de
ponctuation, etc. Une expression comportant
des caractères littéraux et un caractère point
définit un ensemble fini de chaînes de carac-
tères. Par exemple, I'expression régulière . our
permet de représenter I'ensemble des chaînes
composées d'un caractère quelconque suivi
des caractères littéraux "our". Cette expres-
sion reconnaîtra par exemple les mots "pour"
et "jour". La présence du caractère quelcon-
que est obligatoire, le mot "our" ne sera pas
reconnu par I 'expression.
Nous supposons dans cette partie que les
chaînes de caractères ne comportent qu'une
seule ligne. Le comportement du caractère spê
cial point dans les chaînes de caractères compo-
sées de plusieurs lignes sera présenté au début
de la section Utilisation auancée.
Closses de coroctères
Dans le formulaire de I'exemple, le champ con-
tenant le numéro de téléphone doit compor-
ter dix chiffres sans caractères d'espacement,
par exemple "0491000000". Les caractères
littéraux de 0 à 9 ne peuvent pâs être utilisés
tels quels dans I'expression régulière car cela
Niveou de difficulté
es expressions régulières, ou rationnelles,
décrivent un ensemble de chaînes de ca-
ractères. Elles définissent des règles de
vérification, de recherche et de substitution de
sous-chaînes. Ces expressions sont utilisées dans
les applications web notamment pour vérifier et
manipuler les données issues de formulaires [ex-traction et remplacement de sous-chaînes). En
JavaScript elles vous permettront de vérifier la
conformité des données saisies dans un formu-
laire avant son envoi par le navigateur. Du côté du
serveur, vous les utiliserez dans vos scripts PHP
pour contrôler la validité des données reçues et
pour effectuer des traitements sur ces données(extraction et mise en forme d'informations).
Vous pourrez également les utiliser dans MySQL
pour effectuer des recherches avancées.
Deux types d'expressions régulières peuvent
être utilisés en PHP, les expressions régulières
standards (POSIX), et les expressions régu-
lières PCRE (Perl,Compatible Regular Expres-
sions). Nous avons choisi de vous présenter les
expressions PCRE car elles sont plus puissantes
et plus rapides. De plus, étant disponibles dans
JavaScript, les expressions régulières PCRE écri-
tes dans vos scripts PHP pour vérifier les don-
nées pourront être également utilisées dans les
scripts JavaScript afin de vérifier les formulaires
avant leur envoi.
Nous vous présenterons de manière pro-
gressive la syntaxe des expressions régulières
sur des exemples simples. Une fois les bases ac-
quises, vous apprendrez à utiliser les fonctions
PHP avec ces expressions afin de vérifier si une
chaîne de caractères est valide, de séparer une
chaîne selon un motif, d'extraire et de rempla-
cer des sous-chaînes. Nous prendrons comme
exemple un formulaire d'inscription (voir la
Figure l) afin d'illustrer la vérification et la
recherche de données. Nous vous préciserons
ensuite les cas dans lesquels I'utilisation d'une
expression régulière n'est pas efficace. Enfin
nous présenterons des notions avancées d'utili-
sation et I'utilisation des expressions régulières
en JavaScript et MySQL.
Syntoxe des express ions régul ièresUne expression régulière permet de représenter
un ensemble de chaînes de caractères. L'expres-
sion peut être composée de caractères littéraux
et de caractères spéciaux.
Coroctères l i t téroux
Il est possible avec une expression régulière de
rechercher si une chaîne de caractères est incluse
dans une autre chaîne, par exemple le mot jour
dans lacha îne"Bon jou r , encore un lou r de
ptuie". L'expression régulière jour est compo-
sée dans ce cas d'une suite de caractères littéraux,
c'est à dire de caractères qui n'ont aucune signifi-
cation spéciale pour le moteur d'expressions rê
gulières 0ettres de I'alphabet, chiffres,...).
La recherche de correspondance entre une
expression régulière et une chaîne de caractères
1 2
3
utln
sl2007
restreindrait I'expression à une recherche litté-rale d'un numéro de téléphone unique. Vousavezvu que le caractère point représente un ca-ractère quelconque. L'expression . .pourrait être utilisée pour indiquer une re-cherche de dix chiffres, mais celle-ci n'indi-que pas que les dix caractères doivent être deschiffres. Une telle expression reconnaîtraitun numéro de téléphone mais aussi la chaîne
"xxxxxxxxxx". Les classes de caractères per-mettent de préciser dans quel ensemble de ca-ractères la correspondance doit être cherchée
[Tableau l).Une classe de caractères est un ensemble fini
de caractères. Le caractère point dont nous ve-nons de parler représente à lui seul I'ensemblede tous les caractères, c'est la plus grande classede caractères disponible. Il est possible d'utiliserdes classes prédéfinies (chiffres, mots, ...) ou dedéfinir ses propres classes.
La séquence spéciale \a (decimal digit) re-présente I'ensemble des chiffres. Le caractère \permet de différencier le caractère littéral d dela classe de caractères. Dans une expression régulière, ta indique que le caractère doit être unchiffre quelconque. Ainsi, dans le formulaired'inscription, le champ numéro de téléphonepeut être vérifié par I'expression régulière \d\d\d\d\d\d\d\d\d\d. Cette expression recon-naît toutes les chaînes composées de dix chiÊfres (n'importe lesquels).
D'autres classes permettent de recherchercertains caractères spécifiques dans une chaî-ne. La classe \s représente tous les caractèresd'espacement (saut de ligne, retour chariot,saut de page et tabulation). La classe de ca-ractères l* (word) est utile pour représenterdes mots informatique, celle-ci comporteI'ensemble des lettres de I'alphabet, les chif-fres et le caractère souligné _. En fonction despréférences de localisation, la classe inclutégalement les lettres accentuées. Par exem-ple, si I ' instruct iorr setlocal-e (LC_ALL, ' fr_
FR. iso88591 ' ) , . es t p lacée dans le scr ip t , ousi la localisation a ce réglage par défaut, alorsles accents de l'Europe de I'Ouest pour les let-tres en minuscules et majuscules seront com-pris dans la classe \w.
Utilisées avec la lettre majuscule, ces clas-ses représentent leurs contraires : to signifietout caractère saufun chiffre, \s tout caractè-re sauf un espace, \w représente tout caractèrequi ne fait pas partie de I'ensemble des mots.
Il est possible de definir ses propres classes decaractères dans une expression en utilisant lanotation I t. La liste des caractères de la classeest placée entre crochets. Par exemple Iaeiouy]permet de définir la classe des voyelles. Pour re-présenter la classe des lettres minuscules de I'al-phabet vous pouvez énumérer chaque lettre ouutiliser le caractère - qui permet de définir unintervalle. Ainsi ta-21 représente la classe deslettres de I'alphabet en minuscules. Il est possi-ble de placer plusieurs intervalles dans la classe.
www.phpsolmog.org
L'expression régulière [a-zA-zo-9] se lira : tou-te lettre de I'alphabet (minuscule ou majuscule)ou tout chiffre.
Les classes \d, \w et \s que vous avez vuesprécédemment sont des abréviations de classes.Pour représenter un chiffre il est possible d'uti-liser \a ou son équivalent t o-9 I .
Il est parfois plus simple de lister ce que I'on neveut pas plutôt que de fournir la liste de ce quiest autorisé. Le complémentaire d'un ensemblede caractères est obtenu en plaçant un accent cir-conflexe derrière le crochet ouvrant de la classede caractères. Si par exemple on recherche toutcaractère dans une chaîne sauf des chiffres, il suÊfit d'interdire la classe de caractères des chiffres
avec I'expression régulière t^o-s I . Si I'accent cir-conflexe est situé ailleurs qu'en début de classe, ilne représente plus le complément mais le carac-tère littéral accent circonflexe.
Dans PHP les expressions régulières PCREsupportent également les classes POSX (f o""r,upper, alpha, diglt, ...). Ces classes s'écriventdans les crochets de classe de caractères. Ellessont représentées elles-mêmes entre crochets, etleur nom est suivi et précédé du caractère :. Parexemple la classe de caractères POSIX lower re-présente les lettres de I'alphabet en minuscules.L'expression régulière [ [ : lower: I 1 + appliquéeà la chaîne de caractèreS "Bonjour", trouvera lacorrespondance " on j our".
Figure 1. Formuloi re d ' inscr ipt ion
Figure 2. Formuloi re d ' inscr ipt ion erroné
Pour les débutonts -
l nd i co teu rs d 'occu r rence
Reprenons I'exemple du numéro de télépho-
ne du fbrmulaire. Vous âvez vu que I'expres-
s ion régu l i è re \d \d \d \d \d \d \d \d \d \d recon-
naî t des numéros composés de dix chi f f res.
Plutôt que d 'écr i re d ix fo is \a, i l est possib le
dc préciser le nombre d 'occurrences souhai-
tées en plaçant ce nombre entre accolades.
L 'cxpression régul ière \d t 1o ) rcconnaît les
mêmes numéros de té léphonc que I 'cxpres-
sion précédente.
l - ' i nd i ca teu rd 'occu r rences { } pe rmet
d' indiqucr un nombre cxact d ' t - rccurrcnces
ainsi que le nombrc minimum cVou maxt-
mum d'occurrences (Tablcau Z). Cet indi-
catcur ou quant i f icateur est touj t lurs p lacé
après le caractère l i t téral quant i f ié (ou la
c lassc de ca rac tè res ) . A ins i \ d {n } i nd iquera
que le nombre doit comporter n chiffres con-
sécut i fs (aucun autre caractère n 'est admis
cntre les chi f f res) , \d{n, I s igni f icra que le
nombre doi t ôtre const i tué d 'au mct ins n chi f -
fres et \ d { n, m } représcntera ttlus les nombres
composés au moins de n chi f f rcs et au plus de
rn chiffrcs.
Des abréviations sont définies pour les oc-
currenccs lcs plus fréqr.rcntcs. Lc quantificâtcur
z indique que le caractère est optionncl, c'est
l 'équivalent dc {0, r } . l , ' indicatcur d ' t tccurrcn-
ce + pcut être util isé lorsque le caractère doit
apparaître au moins une fois, sans limite maxi-
male, c'est l 'équivalent du quantificateur { 1, } .
Enfin, * permet d'indiquer que le caractère doit
être présent z.éro, une ou plusieurs fois, sans
préciser le nombre d'occurrences maximal, i l
permet de rcmplacer io, ) .
I l est possible d'appliquer un quantificateur
à plus d'un élément en util isant dcs parenthè-
ses. La quantification porte alors sur la sous-
expression entre parenthèses. Par exemple,
I ' exp ress ion regu l i è re ( \d {2 ) \ s ) {4 } reconna î t
les chaînes de caractères comportant quatre
groupes dc dcux chifÏres suivis par un caractère
d'espacement. Cette expression reconnaîtra la
sous -cha îne "04 91 22 33 " dans la cha îne "oq
9 1 2 2 3 3 4 4 " .
[ ,es indicateurs d 'occurrence sont d i ts g lou-
tons (voir plus loin L|ti l isation auancée). l ls
reconnaissent le nombrc maximal de carac-
tères possib le. t -a correspondancc est dans
un premicr temps réal iséc jusqu'à la f in dc la
chaînc de caractèrcs, puis des caractères sont
rest i tués s i nécessaire af in dc sat is fa i re la f in
de I 'cxpression régul ière. Par exemple, I 'ex-
pression régul ière <b>. *</b> reconnaît ra la
s t - l us -cha îne <b> j ou r< /b> de <b>p lu ie< , /b>
dans la cha îne dc ca rac tè res un <b> j ou r< /b>
d e < b > p l u i e < / b > ! ! !
Coroctère d 'échoppement
Le fbrmulaire d'inscription accepte des numé-
ros de téléphone au format international. Ces
numéros sont préfixés par lc code du pays, par
cxcmple +33497223344 pour la France. l , 'ex-
pression régulière qui reconnaît ces numéros
doit donc indiquer que la chaîne comporte un
caractère' + suivi dc onze chifÏres (lcs deux pre-
miers chiffres étant le codc du pays). Vous avcz
vu que les expressions régulières comportent
un certain nombre de caractèrcs qui tlnt unc
signification particulière. Le caractère + en fait
partie, c'est un quantificateur. Il ne peut donc
pas être util isé littéralement dans la chaîne.
Afin d'lndiquer que le + n'est pas spécial dans
le cas qui nous intéresse, il faut le faire précéder
par le caractère d'échappement \. L'expression
régulière reconnaissant le téléphone au format
internat ional est donc \+\d { 11}.
l,es caractères spéciaux à I'extérieur des clas-
s e s d e c a r a c t è r e s s o n t + ? * ^ $ t l O { } l
ainsi que le caractèrc d'echappement lui-mêlne.
Dans les classcs de caractères, lcs seuls caractè-
res spéciaux sont ceux qui ont une signification
pour la classe (marquc de fin de classc, caractère
d'intervallc). [,es caractères contenus dans unc
classe de caractères sont util isés de manière lit-
térale. Par excmple 1'expression t r I recherchera
un point d'interrogation.
Cor respondonces dons lo cho îne
Toutes les exprcssions régulièrcs que nous
avons préscntées jusqu'à présent rect lnnais-
sent des sc'lus-chaîncs à partir de n'importe
quel caractèrc de la chaîne. Par exemple
\d {10 } reconna î t l e numéro de té léphone
" 0 4 g r 2 2 3 3 4 q " d a n s l a c h a î n e " t é l é p h o n e :
o A s r 2 2 3 3 4 q " . l ) a n s l e c a d r c d e l a v é r i f i c a t i o n
dcs formularres i lest important d 'obtcnir une
correspondance tota le de I 'cxpression dans la
chaînc. Le numéro sats i dans le fbrmulai re
doi t respecter lc format st r ic temcnt. I l ne doi t
pas être précédé ou suiv i par d 'autres caractè-
res. I l cx iste des caractères spéciaux, appelés
ancres, qui nc représentent pas un caractère
mais déterminent la posi t ion de la correspon-
dance d 'une expression régul ièrc ou d 'une
sous-cxpression dans unc chaîne de caractè-
res (Tableau 3) . Certa ins caractères spéciaux
ancrent l 'expression régul ière recherchee cn
début ou en fln dc chaîne (voir ésalemcnt L/ti-
l iscttion auunr'ée).
Le numéro de téléphonc du forrnulaire doit
comporter dix chiffres. [,e caractère spécial "
permet d'intcrdire au moteur d'expresstons
régulières de che rchcr une cttrrespondance
débutant ail leurs que sur le premicr caractère.
L 'expression régul ière ^\d{ro } indique une
correspondance à partir du premicr caractère
de la chaîne analysée. Si lc premier caractèrc de
la chaîne n'est pas un chiffre, la corrcspondance
échoue immediatement, le moteur d'exprcs-
sions régulières ne cherchera pas de corrcspon-
dance à partir du deuxième caractère. Seules les
chaînes débutant par dix chiffres seront recon-
nues par I 'expression.
Il est possible d'ancrer I 'expression régulière
à la fin de la chaîne de caractères à analyser avec
I 'ancre $. L 'expression régul ière \d{10}s indi-
que que la fin de la chaine de caractères doit
être terminée par dix chiffres.
Ces ancres sont t rès ut i l isées pour tester
les valeurs entrées dans les formulai res. La
combinaison des deux ancres fourni t I 'ex-
pression ^ \d { 1o } $ qui reconnaît ra les chaî-
nes contenant uniquement d ix chi f f res quel-
conques.
L is t ing 1 . ver i f .php - Fonc t ions de vér i f i co t ion
' :php
s e t l o c a l e ( L C A L L ' ' f r F R ' i s o 8 8 5 9 1 ' ) ;
func t ion isNom ($cha iner i
$ e x p = ' / ^ \ w + ( \ s + \ w + ) * $ / ' ;
r e t u r n p r e g m a t c h ( $ e x p , $ c h a i n e ) , '
func t ion isDate { $date)
$ e x P = ' 3 ^
( ( o ? t 1 - e l ) | ( t 1 2 l \ d ) | ( 3 t o l l ) ) /
( ( o ? t r - e l ) | ( 1 t o 1 2 l ) ) /
( 1 9 1 2 0 ) \ d { 2 i
$ G x ' ' '
re tu rn p reg_match { $exP, $date) ;
func t ion isTe l ($ te ] )
$ e x p = ' 7 " , ( \ + 3 3 ) | # + 3 3 o u
( \ ( \ + 3 3 \ ) ) l # ( + 3 3 ) o u
0 # 0
) \ d { 9 } # s u i v i d e 9 c h j . f f r e s
5 / x ' ;
re tu rn p reg_match ($exp, $ te I i ;
f j o u r
f m o i s
f a n n e e
sl2007
Deux âncres de limites de mot sont disponi-bles \r et son contraire \e. Elles permettent dedelimiter des mots dans une chaîne de carac-tères. Par exemple, dans la chaîne , ,Bonlour,
encore un jou r de p lu ie " , I ' exp ress ion régu_l ière t r l ou. indique que c 'est le mot , , j our, , quidoit être cherché, c'est-à-dire la sous-chaîne jourprécédée par un caractère qui est une limite demot (espace par exemple). A I' inverse I'expres-slon \B j our précise que jour est une sous-chaîned'un autre mot. La correspondance n,est trou-vée que si le caractère qui précède lei n est pasune limite de mot. Cette expression reconnaitla sous-chaîne " jour" du mot , ,Boniour, , .
Al ternot ive
Le caractère t indique I'alternative dans une ex-pression regulière. L'expression régulière que I qur-signifie que I'on recherche soit le premier terme deI'alternative que, soit le second terme qui. L'ordredonné dans I'alternative ne modifie pas le résultatde la correspondance. Si le premierterme n'est pastrouvé, le moteur vérifie le second, puis les autress'ily a lieu. Prenons pour exemple la citation survan te : "L 'expér ience , ce n 'es t pas ce qu ia r r l v e â q u e l q u ' u n , c ' e s t c e q u e q u e l q u ' u n
fa i t avec ce qu i fu i a r r i ve . " . L 'express ion
régulière eue lqui appliquee à cette chaîne trouve
une correspondance avec le "qui,,, situé avant le
verbe "a r r i ve" .
Coroc tè res non impr imob les
Les caractères non imprimables de mise en pa-ge, saut de ligne, retour chariot, saut de page ettabulation sont représentés respectivement parles séquences \n, \r, \f et \r (Tâbleau 4).
Les caractères de contrôle quant à eux com-mencent par \c et sont suivis par un caractère.Par exemple, \ cx représente conr rof -x.
V c r ; f i i : r ' l r - r v < : i i { J i t E .
ri t r n ç: q ; I I r : r r I n *J ç* c-l r.r r"ffi {.r t {:i r+-r rtLes expressions régulières sont très utilisées pourcontrôler la vahdite des données issues d'un for-mulaire d'un site web. Elles permettent de vérifierle format d'un numéro de téléphone, d'un email,...et également de détecter les données qui pour-raient porter atteinte à la sécurité du site.
Cho is i r un dé l im i teu r
d 'expressions régul ières
La fonction PHP preg_march permet de vérifiersi une chaîne de caractères suit un modèle don-né. Elle prend en arguments I'expression régu-lière et la chaîne à analyser et retourne 1 en casde correspondance, o sinon.
L 'expression régul ière passée en paramè-tre est composée d 'un mot i f encadré pardeux dél imi teurs ident iques, par exemplele caractère / . L 'expresslon peut comporteraprès le dél imi teur de f in une ou plusieursop t ions (Tâb leau 5 ) : /mo t i r /op r ions . Le dé -l imi teur peut être pr is parmi n ' importe quelcaractère autre que les caractères spéciaux
www phpsolmog.org
présentés dans la sect ion précedcnte. C'estgénéralement les caractères / ou + qui sontu t i l i ses pour dc l im i te r I ' exp ress ion régu l i e re .Par exemple, I 'expression val idant un chi f f repeu t ê t re éc r i t e / \ d / ou # \d# .
Rendre I ' exp ress ion insens ib le à l o cosseIl est possible de rendre I'expression régulièreinsensible à la casse en ajoutant l,option i en find'expression. Ceci permet d'éviter de précisertoutes les possibil ités majuscules / minusculesdans I'expression elle-même. Par exemple, I 'ex-presslon / [a-z] +,/i reconnaîtra tous les motscomposés de lettres de I'alphabet en maiusculesou minuscules.
Ajouter des
commento i res dons I ' exp ress ion
Les expressions régulières complexes peu-vent être rendues plus lisibles en ajoutant descommentaires et des caractères d'espacement.L'option x permet d'indiquer au moteur d'ex-pressions regulières qu'il doit ignorer les espacesdans I'expression ainsi que le texte commenté.
Tobleou 1. Closses de coroctères
I 1
[ " ]
t - l\ ;
Un coroctère quelconque
Tout coroctère de lo l iste contenue entre crochets
Tout souf un coroctère de lo l is te contenue entre crochets
Intervol le
Tous les chi f f res: [0 9]
Tout souf un chiffre
Tous les mots ( let t res, chi f f res ou coroctère _) : lo-zA-20-9_l
Tout souf un mot
Coroctères d 'espocement
Tout souf un coroctère d'espocement
Les commentaires commencent par un caractè-re # et se terminent à la fln de la l igne courante.
L'expression régulière qui reconnaît un nu_méro de téléphone s'écrit sans I'option x :
/ ^ ( ( \ + 3 3 ) | ( \ ( \ + 3 3 \ ) ) t O ) \ d { e } $ /En util isant I 'option x, i l est possible de I'aé_
rer et d'ajouter des commentaires facilitant soninterprétation :
/ " ( ( \ + 3 3 ) I # + 3 3 o u( \ ( \ + 3 3 \ ) ) | # ( + 3 3 ) o u
0 # 0
) \ d { 9 } # s u i v i d e 9 c h i f f r e s
) / x
Exemp le de vé r i f i co t i on
de chomps de fo rmu lo i re
L'exemple présenté dans cet article est une vé-rif ication de données d'un formulaire d'inscrrption avec des expressions regulières (Figure Z).Le script PHP du Listing 2 réalise I'affichagedu formulaire, sa vérification ainsi que le trai-tement des données si celles-ci sont valides. Lafbnction de traitement des données a eté laissée
\ , .
\D
\W
\s
\S
+
?
{n}
{n , }
Tobleou 2. I ndicoteurs d 'occurrence
{n,m}
Zéro, une ou plusieurs occurrences
Au moins une occurrence
Opt ionne l
Exoctement n occurrences
Au moins n occurrences
Au moins n occurrences et ou plus m occurrences
Tob leou 3 . Pos i t i on de lo co r respondonce dcns lo cho îne
^ Correspondonce en début de choîne ou de l igne (mode mul t i - l ignes)
$ correspondonce en fin de choîne ou de ligne (mode multi-l ignes)
\b L imi te de mot
\B Pos une limite de mot
\A Correspondonce en début de choîne ( indépendont du mode mui t i - l ignes)
\Z Correspondonce en fin de choîne (indépendont du mode multi-l ignes) -,;t j*mffï
vide dans l'exemple car nous ne nous intéres-
sons dans le cadre de cet article qu'à l'analyse
des données reçues. Nous ne décrirons pas le
code du listing formul-aire.php qui est chargé
de réaliser I'affichage du formulaire et d'appeler
les fonctions de vérification. Ce script inclut le
script veri f .pnp (Listing I ) déclarant les fonc-
tions de vérification des champs de formulaire.
La vérification fait appel à trois fonctions, cha-
cune utilise une expression régulière.
La fonction isNom vérifie que la chaîne pas-
sée en paramètre suit le motif ^\w+ (\s+\w+) *$.
Cette expression assez simpliste autorise un ou
plusieurs mots séparés par des espaces. Les mots
peuvent contenir des lettres, chiffres ou carac-
tères soulignés ainsi que des accents car nous
avons indiqué la localisation avec setlocare. Si
la chaîne est reconnue par le motif la fonction
retourne 1, o sinon.La fonction isDate vérifie que la chaîne reçue
en paramètre suit le format de date voulu. C'est-
àdire i)/nm/aaaa. Le jour et le mois peuvent
être donnés sur un ou deux caractères s'ils sont
inférieurs à dix. Nous avons utilise c plutôt que
,/ comme délimiteur pour éviter d'avoir à protê
ger le caractère / présent dans le format de date.
Nous aurions pu utiliser une expression plus
simple permettant de vérifier rapidement que le
format général est suivi ̂ \d t 2 ) / \d { 2 } / \d { 4 } $.Mais une expression de ce type laisse passer un
grand nombre de dates incorrectes, comme par
exemple oo/gg/2222. Nous avons choisi d'écrire
une expression un peu plus évoluée permettant
d'indiquer que le jour est un nombre compris
entre 01 et gr (le 0 étant optionnel), le mois est
compris entre 01 et rz (o optionnel) et I'année
fait partie du vingtième ou du vingt<t-unième
siède. Cette expression laisse passer des dates
incorrectes comme le tt/oz/zoo7, mais elle est
bien plus restrictive que I'expression précédente.
La fonction PHP checkdate pourrait être utili-
sée pour vérifier la validité de la date.
( ( 0 ? t 1 - 9 1 ) | ( t 1 2 1 \ d ) | ( 3 t 0 1 1 ) ) / # j o u r
( ( 0 ? t 1 - 9 1 ) | ( 1 t 0 1 2 1 ) ) / # m o i s( 1 9 1 2 0 ) \ d { 2 ) # a n n e e
) L d x
La fonction isrel vérifie que le numéro de télé-
phone saisi suit bien le format voulu. I-.lexpres-
sion autorise les numéros au format internatio-
nal parenthesé ou non, ainsi que les numéros
sans préfixe de pays (caractère 0 suivi de neuf
chiffres). Les numéros ci-après sont équivalents
et reconnus par la fonction ; "(+33) 491223344",,' +3349L223344 " et " 0491223344".
Découper une choînede coroctèresDes fonctions PHP dédiées à la manipulation
de chaînes de caractères (voir la section Utiliser
Ies expressions régulières à bon escient) permettent
de découper une chaîne en fonction d'un sépara-
teur. Ce séparateur peut être un caractère unique
ou une suite de caractères. Avec les expressions
régulières il est possible de séparer les éléments
d'une chaîne à partir d'un motif complexe. [,a
fonction preg_split applique une expression rê
gulière pour découper une chaîne de caractères.
Son premier argument est I'expression régulière
à appliquer à la chaîne. [,e deuxième argument
est le texte à découper. [,a fonction retourne
les souschaînes dans un tableau. Le motif qui a
permis d'effectuer la séparation n'est pas présent
dans les souschaînes retournées.
L'expression régulière [ . ! ?] \s+ de I'exemple
ci-après permet d'obtenir les phrases d'un texte.
Elle effectue la séparation lorsqu'un caractère
de fin de phrase est suivi d'un caractère d'es-
pacement. Dans cet exemple, le tableau $tab-phrases retourné par la fonction preg-split
comporte deux éléments. Le premier est la chaî-
ne de carac tères "J 'a f f ron tera i ma peur "
et le second la chaîne ".re lui permettrai
d e p a s s e r s u r m o i , a u t r a v e r s d e m o i " .
Comme nous I'avons précisé plus haut,le motif
utilisé pour la découpe n'est pas inclus dans les
sous-chaînes, les phrases obtenues ne compor-
tent pas le caractère de ponctuation final ainsi
que les espaces qui le suivent.
$ c i t a t i o n = " J ' a f f r o n t e r a i m a p e u r . J e l u i
permet t ra i de passer sur mo i , au
t r a v e r s d e m o i . " ;
$ e x p = ' / l . l ? ) \ s + / ' , '
$ tab_phrases = preg_sp l i t ($exp, $c i ta t ion) ;
Obtenir les correspondqncesde I 'expression dons lo choîneDes fonctions permettent d'obtenir la ou les
correspondances de I'expression régulière dans
la chaîne de caractères et d'extraire des parties
de ces correspondances.
Obtenir une correspondonceVous avez vu dans la section sur la vérification
de la validité d'une chaîne de caractères que la
fonction preg-match prend en paramètres I'ex-
pression à rechercher et la chaîne à analyser et
retourne la valeur 1 en cas de correspondance
ou o sinon. Cette fonction permet également,
lorsqu'on lui fournit un tableau en troisième
argument, d'obtenir les correspondances d'une
expression régulière dans une chaîne de caractè
res. Les correspondances trouvées sont placées
dans le tableau.Supposons que I'on souhaite extraire le prê
nom d'une chaîne comportant un prénom et
un nom séparés par un caractère d'espacement.
L'expression ̂ \w+\s permet d'indiquer que
nous recherchons la partie comprise entre le
premier caractère de la chaîne $nom et le pre
mier caractère d'espacement (inclus). La fonc-
tion preg_match trouve une correspondance
et la stocke dans la première case du tableau.
Le prénom devient accessible dans le code PHP
avec $matches [0 ] .
$ e x P = I / ^ \ w + \ s / r ;
$ n o m = ' M a g a l i C o n t e n s i n ' , '
preg_match($exp, $nom, $matches) i
Tobleou 4. Coroctères non impr imobles
\t Tobulotion
\r Retour choriot
\cx Coroctère de contrôle : control-x
U Inverse I'ovidité des quontificoteurs (non PCRE)
Tqbleou 6. Groupement et mémorisotion
Mémorise lo choîne reconnue por lo sous-expression entre porenthèses
Tobleou 5. Opt ions oppl icobles oux expressions régul ières
Rend I'expression régulière insensible à lo cosse
Mode single line : le coroctère \n est. reconnu por le coroctère .
Permet d'ossocier une clé pour occéder à lo choîne reconnue por,lo sous-expression
Référence lo sous-expression numéro idons I'expression régulière
5/2007
Obtenir lo toto l i té des correspondonces
La fonction preg-match ne récupère que la
première correspondance dc I'exprcssion re-
gul ière dans la chaîne de caractères analysée.
Pour obtenir I 'ensemble dcs corrcspondan-
ces dans la chaîne il fàut uti l iser la fbnction
preg_match -a r r . Cc l l c -e i p rcnd l cs mômes
arguments que la fbnct ion preg-match. Si par
exemple on rechcrche le caractère a dans gnom,
I' instruction suivante :
p r e g m a t c h a I I ( " / a / " , 5 n o m , $ m a t c h e s ) ;
a f f e c t e r a d a n s l a c a s c $ m a t c h e s [ 0 ] l e t a -
b leau des cor respondances t rouvées dans le
p r é n o m . I c i i l s ' a g i r a d ' u n t a b l e a u d e d e u x
c a s e s c o n t e n a n t l e s d e u x " a " d u p r é n o m
" M a o a 1 i ' l
Obten i r I es co r respondonces
ovec les sous-expressions
[.es parenthèses 1 ) dans une exprcssion régulière
permcttent dc capturer les parties de la chaine qui
sont reconnues paï la sous-cxpresstt-rn parenthesée.
Ceci permet, par exemple, de mémoriser séparé
ment le code international et le numéro de télépht>
ne provcnant de notre formulaire. l,'exprcssion ^ t\
+33) (\d{ 9} )$ comportedeuxst-nts-expressic'lns. Ia
première mémorise le codc, la seconde capture les
neuf dcrniers chiffres du numero.
$ e x p : ' 7 " 1 \ + 3 3 ) ( \ d { 9 } ) $ / ' ;
Snumero : ' , +33491223344 ' ;
p r e g m a t c h ( $ e x p , $ n u m e r o , $ m a t c h e s ) ;
[ -a première case du tableau, Smatches Io]
conticnt l 'enscmble de la chaîne'trouvée, soit
si le numéro est valide le numéro dans sttn in-
tegral i té. La seconde case $matches [1] stocke
la sous-chaîne "+33" reconnue par la première
sous-expression entre parenthèses. La troisiè-
me case gmatches t2 l s tocke le contenu de la
seconde parenthèse (les 9 chiffres composant
lc numértr de tc lephone).
Comme il a été dit précédemment, les pa-
rcnthèses peuvent être utilisées pour appliquer
un quantificatcur à un ensemble de caractères,
classes ou groupement de caractères. La mémo-
risation dans le tableau gmatches n'étant pas
fbrcément voulue, i l est possible d'uti l iser les
parenthèses pour a1-tpliquer un quantificateur
srlr une sous-partie de I'expression régulièrc
sans pour autant mémoriser le contenu de la
parenthèse. Il suffit dc fàire précéder le contenu
dc la parenthèse par la marque z: . Par exemple
l i s t i ng 2 . fo rmu lo i re php
I D O C T Y P E h t M I P U B L I C " - / / W 3 C / / D T D X H T M L 1 . 0 S t T i C t / / E N ' '
" h t t p : / / w w w . w 3 . o r g l T R / x h t m l 1 / D T D / x h t m l 1 - s t r l c t . d l d "
h tml :
h e a d '
' t i t l e , I n s c r i p t i o n ' , t i t 1 e . '
, l i n k r e l = " s t y l e s h e e t f o r m ' c s s "
., head '
. b o d y ,
. h 1 , C t u b d u r a n d o n n e u r - F o r m u l a i r e d ' i n s c r i p t i o n h 1
' , p h p
r e q u i r e I ' v e r j - f . p h p ' I ;
f u n c t i o n i n s c r i r e ( $ n o m , $ p r e n o m , $ d a t e , $ t e 1 )
/ / fonc t ion qu i inscr i t une personne
e c h o ' ' : p i n s c r i p t i o n e n r e g i s t r e e ' : ' p : ' ' , " \ n " ;
func t ion recupVar iab leForm($namel i
i f i i s s e t { S P O S T ; $ n a m e i ) ) 1
r e t u r n s t r i p t a g s ( $ _ P O S T $ n a m e ) ;
re tu rn ' ' ;
func t ion c reerChampSaj .s ie t$ in t i tu le , $name, $va lue i
e c h o " . t r > \ n \ t . t d ' " , $ i n t i t u I e , " . : , ' t d ' \ n \ t . , t d ) " ;
e C h o ' . . i n p u t t y p e : " t e X t " n a m e = " ' , $ n a m e , I r l
v a f u e = " ' , $ v a l u e , I t t i . > | ;
e c h o " . . i t d ) ' \ n , . : t r : - ' \ n " ;
f u n c t i o n a f f i c h e r F o r m ( $ n o m = " , $ p r e n o m = " , $ d a t e = ' I '
q l - ô l = r r l
e c h o " - d i v ; ' \ n " ;
e c h o ' . : f o r m a c t i o n = " f o r m u l a i r e . p h p "
m e t h o d = ' , p o S 1 " : , ' , , ' \ n " ;
e c h o " . : . t a b l e ) ' \ n " ;
c r e e r C h a m p S a i s i e ( ' N o m ' , ' n o m ' , $ n o m l ' '
c r e e r C h a m p S a i s i e , ' P r e n o m ' ,
' p r e n o m ' , $ p r e n o m , ;
c r e e r C h a m p S a i s i e t ' D a t e d e n a i s s a n c e ' , ' d a t e ' ,
$ d a l e ) ;
c r e e r C h a m p S a i s i e { ' T e I . ' , ' t e 1 ' , $ t e 1 ) ;
e c h o " . t r \ n \ t t d c o l s p a n = t 2 t i l '
e c h o ' . r i n p u t t y p e = " s u b m i t " n a m e = " a c t i o n "
v a l u e = " I n s c r i p t i o n " , ' . ' ' , '
e c h o " . . "
t d > \ n < , / t r > \ n . . : ' t a b l e > \ n ' : . . f o r m > \ n ' : . ' d i v ' ' \ n " ;
f u n c t i o n v e r i f i e r i S n o m , $ p r e n o m , $ d a t e , 9 t e 1 )
$champs faux = ar ray l ;
1 t ! r s N o m ) n o m I
$ c h a m p s f a u x = ' n o m ' ;
i f t I i511o* i$prenom) 1
$ c h a m p s f a u x = ' P r e n o m ' ;
i f , ! i s D a t e 9 d a t e
( n h r m n c f e r r w = t d a t e ' ;
i f r ! i s r e l ( $ t e l ) ) ,
$ c h a m p s _ f a u x = ' t e l e p h o n e ' ;
raa , r rn i rnp lode { ' , ' , $champs- faux t ;
/ / s i des donnees on t e te recues
i f { i s s e t i $ P O S T i r a c t i o n r l ) ) a
/ / recuperer Les donnees
$nom = recupVar iab leFormi Inom' ) ;
$ p r e n o m = r e c u p V a r i a b l e F o r m ( ' p r e n o m ' ) ;
$ d a t e = r e c u p V a r i a b l e F o r m ( ' d a t e ' ) ;
$ t e I = r e c u p V a r i a b l e F o r m i ' t e f i ;
/ / veri f ier fes donnes
S e r r e u r s = v e r i f i e r ( $ n o m , $ p r e n o m , $ d a t e , $ t e l l ;
/ / s i donnees cor rec tes fes t ra i te r
i f i e m p t y ( $ e r r e u r s ) ) r
,
i n s c r i r e i $ n o m , $ p r e n o m , $ d a t e , $ t e l r ;
/ / s inon a f f i cher fe fa rnu la i re
e lse ;
a f f i cherForm(Snom, $prenom, $date , $ te1 ; ;
echo ' . lp . ;cor r igez : ' , $er reurs , " . . . , ' p > \n" ;
I
, e l s e i
aff icherForm (l , '
, - - 'body
html : '
www.phpso lmog.org
Pour les débutonts
si la fonction preg_match reçoit en argument
I ' e x p r e s s i o n / ^ ( ? : \ + 3 3 ) ( \ d { 9 } ) S / , a l o r s l e
code international +33 ne sera pâs capturé et
le numéro de téléphone sera stocké dans la case
$ m a t c h e s [ 1 ] .
Vous venez de voir que I'accès au con-
tenu des parenthèses est réalisé en donnant
le numéro de la parenthèse capturante dans
le tableau $matches. Il est également possi-
ble d'accéder au contenu en utilisant les clés
dans le tableau associatif smatches. La no
tation (?p<nom>) permet d'indiquer la clé
donnant accès au contenu de la parenthèse.
Le tableau obtenu comportera une case avec
accès par indice par parenthèse capturante
plus les cases avec accès par clé. La fonction
p reg_match lorsqu'elle reçoit I'expression régu-
l ière suivante /^ (?P<code internat ional>\
+ 3 3 ) ( ? P < t e l e p h o n e > \ d { 9 } l S / , g é n è r e u n
tableau de cinq cases. La case dont I'indice
est o contient la correspondance globale.
L'accès au contenu capturé par la première
parenthèse est réalisé avec Smatches[1] ou
$matches [ ' code in te rna t iona l ' ] e t ce lu i
de la deuxième parenthèse avec $matches [2]
ou Smatches [ ' t e lephone ' ] .
Remplocer des sous-choînesLes fonctions de manipulation de chaînes de
caractères standards [voir la section Utiliser les
expressions régulières à bon escient) permettent deremplacer un ou plusieurs caractères littéraux
dans une chaîne. Avec une fonction de rempla-
cement basée sur les expressions régulières il estpossible d'effectuer les substitutions de toutesles parties d'une chaîne qui sont reconnues par
un motif.La fonction preg_replace recherche les cor-
respondances d'une expression régulière dans
une chaîne de caractères et les remplace par une
chaîne composée de caractères littéraux et éven-
tuellement de références aux contenus mémorisés par I'expression. Cette fonction prend enargument, dans I'ordre, I'expression régulière, la
chaîne de remplacement et la chaîne à traiter. Lafonction retourne une chaîne de caractères, ellene modifie pas la chaîne dans laquelle les corres-pondances ont été recherchées.
Prenons I'exemple du numéro de téléphonefrançais. Il peut être saisi dans le formulaire
d'inscription au format international avec ousans parenthèses ou directement sans indiquer
le préfixe de pays (caractère o suivi de neuf
chiffres). Les numéros ci-après sont équivalentset acceptés par le script de traitement de I'ins-
cript ion : " (+33:r 491223344", "+334 91223344"
et "0491223344". Afin d'uniformiser les nu-
méros de téléphone des membres du club, un
traitement peut être réalisé avant d'enregistrerles données. Par exemple, vous pouvez déciderde remplacer les parties (+33) ou +33, lors-qu'elles sont présentes, par un caractère o demanière à ce que tous les téléphones suivent le
format composé uniquement de dix chiffres (le
premier chiffre étant le caractère o). La fonc-
tion preg_replace ci-après effectue ce traite
ment. Elle retourne dans cet exemple la chaîne
" 049L223344" .
$ t e 1
$exp
$ t e 1
= ' 1 + 3 3 ) 4 9 L 2 2 3 3 4 4 ' ;= ' / ^ ( \ + 3 3 ) | \ ( \ + 3 3 \ ) / ' ;
f o rmate = p reg rep lace ($exp , ' 0 ,
$ t e l ) ;
La chaîne de remplacement peut faire réfé-
rence aux contenus capturés par les sous-ex-pressions. La séquence \\1 (qui peut égale-ment s'écrire sr) fait référence au contenu mé-
morisé par la première parenthèse de I'expres-
sion régulière. Dans I'exemple du formulaireles dates sont saisies au format 1j/mm/aaaa.Vous pouvez transformer la date afin de l'écri-
re dans le format de date de MySQL avec la
fonction preg _ replace. IJexpression réguliè-re ̂ ( \ d t2 ) ) / ( \ d {2 } ) / ( \ d {4 } ) $ cap tu re l es pa r -
ties jour, mois et année de la date. Le caractè-
re # est utilisé comme délimiteur à la place du
délimiteur / pour éviter de devoir protéger les
caractères / apparaissant dans la date. La chaî-ne de remplacement réorganise les donnéescapturées pour produire une date au formataaaa-mm-jj. Pour la date $date, la fonction re-
tournera la chaîne '2oo'7-oi-2r'.
$ d a t e = " 2 I / 0 1 / 2 0 0 1 " ;
$ e x p = ' # " ( \ d { 2 } ) / ( \ d { 2 i ) / ( \ d { 4 } ) $ # ' ;
$date_mysq l = p reg_rep lace ($exp,
' \ \ 3 - \ \ 2 - \ \ 1
" $ d a r e ) ;
Uti l iser les expressionsrégulières à bon escientVous savez à présent créer des expressions régu-lières et les utiliser pour rechercher la présence
de motifs dans du texte, découper des chaînesde caractères, extraire des sous-chaînes et effec-tuer des remplacements. Les expressions régu-lières sont des outils puissants de manipulationde chaînes de caractères. Elles permettent deréaliser des opérations que les fonctions de ma-nipulation de chaînes classiques de PHP ne peu-
vent pas effectuer. Cette puissance a un cotft entermes d'utilisation mémoire et de temps d'exêcution. Il est donc important de les utiliser à bonescient, c'est-àdire uniquement lorsque vous nepouvez pas obtenir le résultat souhaité avec unefonction ne mettant pas en jeu le moteur d'ex-pressions régulières.
PHP propose un grand nombre de fonc-tions pour effectuer des recherches et véri-fications, extraire des données, séparer deschaînes et supprimer, remplacer ou ajouterdes caractères dans une chaîne sans utiliserd'expressions régulières (Tableau 8). Avantde créer une expression régulière vous de-vez toujours vous demander s'il est possible
d'obtenir le même résultat avec une de cesfonctions. Nous vous invitons à utiliser lesfonctions présentées ci-après à chaque foisque cela vous sera possible.
Fonctions de vérificotionLes données envoyées par le biais de formulai-res sont stockées dans des chaînes de caractères.De nombreuses fonctions PHP peuvent êtreutilisées pour s'assurer que la chaîne contientle type de données attendu. Des fonctions per-
mettent de vérifier qu'une chaîne de caractèresest un nombre entier ou réel (is numeric) ouun entier non signé (ctype_aisit). Les fonc-tions ctype indiquent si tous les caractères dela chaîne appartiennent à une classe donnée.Elles permettent notamment de vérifier qu'une
entrée utilisateur n'est composée que de lettres
de l'alphabet (ctype_a1pha), de minuscules(ctype-tow"t), de majuscules (.typ"-upp"r)
ou encore de caractères alphanumériques (cty-
pe a lnum) .
Fonctions de recherchePour vérifier qu'une sous-chaîne est présente
dans une chaîne de caractères utilisez les fonc-
tions strpos ou stripos. Le nombre d'occur-rences de la sous-chaîne peut être obtenu avec lafonction substr counE..
Fonctions d'extroction de sous-choînesDes fonctions permettent d'extraire une
sous-chaîne à partir d'une position don-née dans la chaîne (substr), de la première
occurrence d'une sous-chaîne dans cette
int preg-motch(string Retourne 1 s'i ly o une correspondonce de exp dons ch, 0 sinon. Lo corres-
exp, string ch, orroy t) pondonce est stockée dons lo cose 0 de t, les coses suivontes contiennent lessous-occurrences mémorisées
string preg-reploce(string exp,string rep, string ch)
Retourne lo choîne ch dons loquelle les sous-choînes qui correspondent à I 'ex-pression exp ont été remplocées por lo choîne rep. Si des sous-occurrencessont définies, elles peuvent être représentées dons rep en util isont \\m,ou $m, m étont le numéro de lo sous-occurrence dons exp
Tobleou 7. Fonct ions PHP pour les expressions régul ières
c h a î n e ( s t r s t r , s t r i s t r ) , o u e n c o r e d e l â
dernière occurrence d 'un caractère dans la
cha îne (s t r r c r r r ) .
Fonc t ions de remp locement
de coroctères
PHP permet de supprimer rapidement tous
les caractères d'espacement de début et de
f in de chaîne ( t . i . , r t r im, l t r im), les carac-
tères \ (st r ipstasrres) et les bal ises HTMI.
(str is tus") . I l permet également de sup-
primer une sous<haîne en utilisant la fonction
str reptace avec une chaîne vide comme ârgu-
ment de remplaccmcnt.
Des fbnctions dédiées à HTMI- permettent
d'ajouter I 'elémcnt <br /> avant chaque passagc
à la l igne (nr2br) et de remplaccr dcs caractères
par des ent i tés HTMI- (htmlspecia lchars,
h t m l e n t i t i e s J .
Plusieurs fbnctions pcuvcnt être util isécs
pour remplacer dcs caractères dans une chai-
ne. La fonction strtr permct dc substituer
toutes les occurrences d'un caractère d'unc
chaîne par un caractère donné. La fonction
substr replace remplacc une sc ' rus-chaîne
à part i r d 'unc posi t i t rn donnéc. La fonct ion
str replace quant à e l lc rcmplace toutes lcs
occurrences d'une sclus-chaîne dans la chaine.
Fonc t ions de découpoge de cho înes
La fonction exptode découpe la chaîne en
fonction d'un séparateur qui pcut être com-
posé d'un ou plusicurs caractères. La fonction
srrrok effectue ellc aussi un découpage mais
à partir d'un caractèrc unique pris dans une
liste. Il est ainsi possible d'obtenir, par exem-
ple, les mots d'une chaîne en fournissant la
chaîne "\n\t " comme séparateur. [-a fonction
str word count retourne tous les mots trouvés
dans la chaîne.
i" i t i I i scti o n $vû n crlr:Nous présentons dans cette partie des notions
avancées. Leur compréhension n'est pas indis-
pensable dans un premier temps. Vous pouvez,
à partir des notions vues précédemment, créer
de nombreuses expressions régulières qui re-
pondront à une grande partie des problèmes
les plus courants de vérification de dorrnées de
formulaires et de manipulation de chaînes de
caractères.
Cho înes compor ton t p lus ieu rs l i gnes
Nous avons travaillé jusqu'à présent avec des
chaînes de caractères ne comportant qu'une
seule ligne. Les expressions régulières peuvent
traiter des chaînes multi-lignes, c'est-à-dire des
chaînes comportant des caractères \n. Nous al-
lons présenter le comportement par défaut du
moteur d'expressions régulières en présence de
telles chaînes, ainsi que les options qui modi-
fient ce comportement.
Vous avez vu dans la section présentant la
syntaxe des expressions régulières que le carac-
www.pnpsormog org
tèrc spécial point est une abréviation pour une
classe de caractères rcconnaissant tout caractè-
re. Ceci est vrai lorsque la chaîne ne comporte
qu'une seule hgne. Par défaut, le caractère point
reconnaît tout caractère sauf \n. Ce comporte-
ment peut être modifié par I 'option r (mode
single line). Avcc cette option le caractère point
rcconnaîtra tous les caractères sans exception.
Dans I'exemple ci-après I'expression réguliere
. + reconnaît la totalite de la chaîne de caractè-
res $ci tat ion car I 'c lpt ion s cst ut i l isée. Sans
cette option preg match trouverait unc corres-
pondance uniquement âvec la partic précédant
le saut de ligne, c'est-à-dirc la sc-rus-chaîne " sans
l a l i b e r t é d e b f â m e r , " .
$ c i t a t i o n : " s a n s l a l i b e r t é d e b l â m e r ,
\ n i l n ' e s t p o i n t d ' e 1 o g e f l a t t e u r " , '
$ e x p = ' / . + / s ' ;
p r e g m a l c h { $ o x p , S c i L a L i o n , S t a b ) ;
Le comportcmcnt des classes de caractèrcs
complémentées n'est pas modifié par la pre-
sence du caractère \n ct n'cst pas affècté par
I 'opt ion s. L 'expressron regul ière [^ ! ]+ rccon-
na î t ra l a to ta l i t é de la cha inc sc i ta t i on Câr
celle-ci nc colnporte aucun caractèrc point
d 'exclamat ion.
Les caractères spéciaux ^ et $, qui indiquent
respectivement une correspondance en début
ct fin de chaîne de caractères, peuvent être uti-
lisés pour rechercher une correspondance en
début et fin de ligne. Ce comportement est ob-
tenu avec I'option * (mode multiJignes). Dans
I'exemple ci-après la chaîne de caractères com-
porte trois l ignes. La fonctron preg match all
trouvera deux correspondances pour I'expres-
sion régulière ^n. + car les deux dernières lignes
colrrmencent par le caractère .'. Sans I'option m,
l'exprcssion regulière chercherait une corres-
pondance en début de chaîne, et non plus en dé-
but de ligne, ce qui conduirait à un échec puis-
que la première ligne de la chaîne commence
par le caractère c.
( n i t : r i n n = t r C o n r r i n o \ n n n r r c i r r ê n â q
\ n n o u s r e n d p l u s f o r t " ;
$ e x p = ' / ^ n . + / m ' ;
p r e g m a t c h a l 1 ( $ e x p , $ c i t a r i o n , S t a b ) ;
En mode mul t i - l ignes, I 'ancre $ indique une
correspondance en f in de chaîne ou avant le
caractère de nouvel le l igne ( le caractère \n
ne sera donc pas présent dans les correspon-
dances). Dans I 'exemple c i -dcssus, s i nous aÊ
fec tons à $e*p I ' exp ress ion régu l i è re n .+g
Tob leou 8 . Fonc t ions de vé r i f i co t i on e t de mon iou lo t i on de cho înes
rs numenc
ctype-digit
c type_olpho
ctype_lower
ctype_upper
ctype_olnum
strpos, st r ipos
substr count
su bstr
strstr, stristr
st r rcnr
trim, ltrim, rtrim
str ips loshes
strip_togs
str- reploce
substr-reploce
strt r
n l2b r
h tm lspec io l -chors
htmlentities
exp lode
strtok
str word count
Vér i f i e s i I ' o rgument es t un nombre ou une cho îne numér ique
Vérifie que lo choîne ne comporte que des chiffres
Vér i f ie que lo choîne ne comporte que des coroctères de l 'o lphobet.
Vérifie que lo choîne ne comporte que des minuscules
Vér i f ie que lo choîne ne comporte que des mojuscules
Vérifie que lo choîne ne comporte que des coroctères olphonumériques
Retourne lo posi t ion de lo première occurrence d 'une sous-choîne
Retourne le nombre d'occurrences de lo sous-choîne
Extroi t une sous-choîne à port i r d 'une posi t ion possée en poromètre
Extroit une sous-choîne à portir de lo position de lo première occurrence d'une séquence
Extroi t une sous-choîne à port i r de lo dernière occurrence d 'un coroctère
Supprime les coroctères d'espocement en début et/ou fin de choîne
Suppr ime les coroctères \
Suppr ime les bol ises HTML
Remploce toutes les occurrences d 'une sous-choîne
Remploce une sous-choîne à portir d'une position donnée
Remploce des coroctères
Insère <br/> devont les coroctères de possoge à lo l igne
Remp loce les co roc tè res " & '< > po r des en t i t és HTML
Remploce les coroctères spécioux, occents, ... por des entités HTML
Découpe une choîne en fonct ion d 'un séporoteur (choîne)
Découpe une choîne en fonction d'un séporoteur(coroctère)
Retourne les mots t rouvés dons lo chqîne
alors la fonction preg - match - al l trou-
vera en mode multi-lignes trois correspon-
d a n c g s : " n e " , " n o u s t u e p a s " € t " n o u s r e n d
p l u s f o r t " .
Il est possible d'indiquer une correspon-
dance uniquement en début ou fin de chaîne
de caractères en utilisant respectivement \eet \2. Ces deux ancres sont indépendantes
du mode multi-lignes. Dans l'exemple pré-
cédent la fonction preg_match-a11 trouvera
trois correspondances (les trois lignes) si elle
reçoit en ârgument /^ .+/m, et une seule cor-
respondance avec I'argument / \4. +/m (la pre-
mière ligne).
Quontificoteurs pqresseux
Lesca rac tè resspéc iaux+ * 2 i n , ) e t { n ,m) eui indiquent le nombre d'occurrence d'un
caractère ou d'une sous-expression sont dits
gloutons ou avides. Ils essaient toujours de re-
connaître le maximum de caractères possible.
Pour illustrer I'avidité prenons I'exemple de
I'extraction du contenu d'un élément HTML
em. Le but est de mémoriser la partie entre la
balise ouvrante <em> et la balise fermante </
em>. Nous supposerons pour simplifier I'ex-
pression que la balise ouvrante ne comporte
pas d'attribut. Si nous utilisons I'expression
<em) ( . * ) <\ /em> alors nous obtiendrons le
résultat souhaité uniquement si la chaîne de
caractères ne comporte qu'une seule occur-
rence de cet élément. Examinons le processus
de recherche de correspondance de I'expres-
sion régulière $exp pour la chaîne de carac-
tères $citation de I'exemple ci-après. Le
moteur d'expressions régulières cherche tout
d'abord le premier caractère de I'expression
régulière dans la chaîne. La recherche de < est
effectuée de la gauche vers la droite à partir
du premier caractère de la chaîne. Une corres-
pondance est trouvée avec le quatrième carac-
tère de la chaîne. Puis le moteur reconnaît les
caractères suivants de I'expression : e, m et ).
L'expression régulière comporte ensuite une
sous-expression (. ") indiquant une recherche
d'un caractère quelconque présent zéro, une
ou plusieurs fois. Cette sous-expression est
appliquée à partir du huitième caractère de
la chaîne. L'avidité entraîne une tentative de
correspondance maximale. C'est-à-dire que
la sous-expression capture tous les caractè-
Tobleou 9. Alternotive, tests et conditions
res jusqu'à la fin de la chaîne. Une fois que le
dernier caractère de la chaîne est atteint, le ca-
ractère . de la suite de l'expression régulière(partie < \ / em>) ne peut plus être trouvé. Afin
d'éviter un échec global, la sous-expression
restitue les caractères un à un de la droite vers
la gauche. À chaque restitution le caractère <
est recherché. Une fois que la sous-chaîne "</em> tranquiJ-re" a été rest i tuée, la dernière
partie de I'expression régulière trouve une
correspondance, ce qui conduit à un succès
global. Le contenu mémorisé par la sous-ex-
pression sera donc la sous-chaîne "rri../"*tn ' e s t p a s u n l o n g < e m ) f l - e u v e " .
$ c i t a t i o n = " L a ( e m ) v i e < / e m > n ' e s t p a s u n
Iong <em>f leuve</em> t ranqu i l le " , '
$ e x p = ' / ( e m ) ( . * ) < \ / e m > / ' ;
p r e g m a t c h ( $ e x p , $ c i t a t i o n , $ t a b l ;
Le comportement des quantificateurs peut
être modifié afin de les rendre à reconnais-
sance minimale. Pour ce faire il suffit d'ajou-
ter un caractère r derrière les indicateurs
d'occurrence. Par exemple x+? signifiera
que I'on cherche le caractère x au moins une
fois mais le moins de fois possible. Repre-
nons I'exemple précédent mais avec une ex-
pression régulière comportânt une sous-ex-
press ion paresseuse <em> ( . *?) < \ /em>. Com-
me précédemment, le moteur d'expres-
sions régulières applique la sous-expression
à partir du huitième caractère de la chaî-
ne $citat ion. La sous-expression étant pa-
resseuse elle ne capture aucun caractère. Le
moteur tente donc d'appliquer la fin de I'ex-
pression à partir du huitième caractère de la
chaîne. Aucune correspondance n'est trou-
vée entre < et le caractère ,r. Afin d'éviter
un échec global la sous-expression est obli-
gée de capturer le caractère v, puis les ca-
ractères i et e. Lorsque le onzième caractè-
re est atteint la dernière partie de I'expres-
sion régulière est trouvée dans la chaîne ce
qui conduit à un succès global. Le contenu
extrait par la sous-expression est dans ce cas
la sous-chaîne vie.
L'exemple pris cidessus était destiné à illus-
trer de manière simple le comportement des
quantificateurs gloutons et paresseux. L'utili-
sation d'une expression régulière comportant
une classe complémentée est plus appropriéepour extraire le contenu d'un élément. Pour
cet exemple, I'expression régulière capturantle contenu de la balis€ em €st la suivante :< e m > ( [ ^ < ] * ) < \ / e m > .
PHP propose également une option u qui
n'est pas compatible PCRE. Cette option inver-
se I'avidité des quantificateurs. Ils deviennentparesseux par défaut et gloutons dans le cas où
un z est ajouté.
Références orrièreLes parenthèses permettent de capturer des
sous-chaînes. Vous avez v! qu'il est possible
d'accéder au contenu mémorisé dans la chaîne
de remplacement de la fonction preg_reprace
avec des références \ \ i ou $ i, i étant le numéro
de la sous-expression entre parenthèses. Il estpossible de faire référence au contenu d'une pa-
renthèse au sein même de I'expression régulière
en utilisant \i. PHP autorise jusqu'à quatre-
vingtdix-neuf références arrières.La référence arrière \r de I'exemple ci-après
permet de rechercher une correspondance avec
un nom d'élément HTML trouvé dans la balise
ouvrante. La première parenthèse mémorise le
nom d'élément. La seconde parenthèse capture
le contenu entre la balise ouvrante et la balise
fermante dont le nom est identique à celui de la
balise ouvrante. Des quantificateurs paresseux
sont utilisés afin d'obtenir une reconnaissance
minimale. L'expression $exp reconnaît la sous-
chaîne "c ie l <b>bas</b> e t rourd" .
$c i ta t ion = "Quand te <em>c ie l <b>bas</b>
et lourd</em> pèse comme un
couverc l -e" ;
$ e x p = ' / < ( . + ? \ > ( . * ? ) < \ / \ 1 > / ' ;
Tests ovont et qrrière
Les tests avant et arrière restreignent les corres-pondances de I'expression. Ils permettent de vê
rifier si la partie à droite (test avant) ou à gauche(test arrière) de la position courante satisfait
une sous-€xpression régulière. Si le test échoue
ceci conduit à un échec global de I'expression
régulière. En cas de succès la correspondance ne
contient pas la partie de la chaîne reconnue par
la sous-expression du test.Le test avant positif ( I =") est vrai si la sous<x-
pression e est vérifiée après la position courante
dans la chaîne. L'expression régulière $exp dans
I'exemple ci-après capture les mots de la chaîne
$citation lorsqu'ils sont suivis par un caractè
re d'espacement suivi du mot qui. La fonctionpreg_match-all trouve les correspondances
"chemin" et "d i f f ic i le" . La sous<haîne qui
n'apparaît pas dans ces correspondances car
les tests avant et arrière ne mémorisent pas le
texte.
$c i ta t i on = "Ce n 'es t pas le chemin qu i
es t d i f f i c i l e , c ' es t l e d i f f i c i l e qu i
e s t ] e c h e m i n " i
I Alternotive
x(?!y) Test ovont négotif
x(?.!y) Test orrière négotif
(?(condition)xly) Si lo condition est vérifiée opplique lo sous-expression x, sinon opplique y
s|2007
Le moteur d'expressions régulières applique
Le test avant négatif l: l"l est vrai si la sous- I 'expression à partir du premier caractère de la
expression e n'est pas vérifiée après la po- chaîne. Si I 'expression échoue à partir de cette
sition courante. Par exemple, I'expression position alors le moteur effectue un décalage.
chemin (? l \squi) qui recherche le mot chemin L 'expression est testée à part i r du deuxième
lorsqu'i l n'est pas suivi par le mot qui, trouvera caractère de la chaîne et ainsi de suite jusqu'à
une correspondance en fin de chaîne. ce qu une correspondance soit trouvée ou que
Les tests arrière positif (?<:e) et négatif la fin de la chaîne soit atteinte. L'uti l isation des
(?<!e)ont lemêmecomportementquelestests ancres de début de chaîne \a et lou de l ignes ̂
avant positif et négatif mais la vérification est ef- évite le décalage de I'expression régulière dans
fectuée à gauche de la position courante. la chaîne de caractères. Ceci permet d'éviter des
véritications.
S e x P = ' / \ w + 1 ? = \ s q u i ) / ' ;
p r e g m a t c h a l l ( $ s x p , S c i t a c i o n , S t a b ) ;
Condi t ions
Une structure conditionnelle équivalente au i r
de PHP peut être utilisée afin d'indiquer qu'une
correspondance avec une sous-expression ré-
gulière e1 ne doit être recherchée que si une
condition est vérifiée. Cette structure s'écrit
(? ( cond i t i on )e11 . La cond i t i on peu t ê t re un
test avant ou arrière ou encore un nombre fai-
sant référence à un numéro de parenthèse.
I1 est également possible d'indiquer les sous-
expressions à utiliser lorsque la condition est
vraie ou fausse (équivalent du ir etse). La
structure conditionnelle s'écrit dans ce cas
(? (cond i t i on )e1 le2 ) . S i l a cond i t i on es t vé r i -
fiée alors la sous-expression e 1 est utilisée, sinon
c'est la sous-expression e2 qui est utilisée.
Prenons I'exemple d'une heure qui peut être
écrite dans une chaîne selon deux formats. Le
premier sépare les heures des minutes en utili-
sant le caractère ' : ' . Le second indique les uni-
tés. Midi et quart pourra être écrit l2: l5 ou l2h
l5mn. L'expression régulière ci-après reconnaît
les deux formats d'heure. Si le test avant ( ?:. * :
) trouve le caractère ' : ' dans la chaîne alors
I ' heu re dev ra su iv re l e fo rmat \d {2 } : \d {2 } .
Sinon, I'heure devra respecter le format avec les
un i tés \d {2 }h \s \d {2 }mn. Pour p lus de c la r té
nous avons ajouté des espacements et des com-
mentaires dans I'expression régulière (l'option *
permet cet ajout).
$ e x p = ' / " ( ? ( ? = . * : ) # i f
\ d t 2 ) : \ d t 2 ) I # t h e n
\ d { 2 } h \ s \ d { 2 } m n # e l s e
\ Ç / x ' ;
Op t im iso t ion
La manière d'écrire une expression régulière
peut avoir un impact sur les performances.
www.pn psormog.org
Nous donnons ci-après quelques indications
pour optimiser les expressions.
Le contenu d'une parenthèse ne devrait être
capturé que s'il est utilisé par la suite. Les pa-
renthèses employées pour le regroupement de-
vraient être non capturantes car la mémorisation
des données consomme de la mémoire vive.
Il est préférable d'utiliser des classes de carac-
tères à la place du caractère point lorsque c'est
possible. L'expression t^ | I + ! sera plus efficace
que I'expression . + I . En effet, le point capture
tous les caractères possibles dans la chaîne avant
d'être forcé de revenir en arrière jusqu'à ce que
le caractère t soit restitué.
Les alternatives sont couteuses en temps
d'exécution. Tànt que la correspondance n'est
pas trouvée tous les termes de I'alternative
doivent être testés. Quand c'est possible il est
souhaitable de les remplacer par des classes de
caractères. Il est plus cfficace d'écrire t o r z I plu-
t ô t q u e ( o t 1 t 2 ) .
Applicotion à JovoScript et MySQLJavaScript supporte un grand sous-ensemble
des expressions PCRE, une même expression
peut donc être utilisée sur le serveur et sur le na-
vigateur pour vérifier des données d'un formu-
laire. JavaScript ne supporte pas les tests arrière,
les conditions, les classes POSX (f o*"., ...), les
correspondances \R et \2, ainsi que les options
s, €t x. La recherche de toutes les correspon-
dances est obtenue avec une option q (global).
L'expression régulière s'écrit /morif ,/oprions.
Le délimiteur est toujours le caractère /. Les
données capturées par les sous-expressions sont
accessibles en utilisant le numéro de la paren-
thèse : indice i- dans le tableau retourné par la
méthode exec recherchant les correspondances,
si dans la chaîne de remplacement (méthode
rept ace), \i dans I'expression elle-même. Dans
I'exemple ci-après la méthode test retourne
iIt -
I
Sur Internet
. http://www.php.net/monuol/fr/ref.pcre.php - Expressions régulières PCRE dons PHP (syntoxe, op-t ions, fonct ions)
. http://www.oreilly.com/cotolog/regexppr/chopter -Téléchorgement grotuit de lo portie PHP du li-vre Regulor Expression, pocket reference - Édi t ions O'Rei l ly
. http://www.pcre.org/pcre.txt - Poges du monuel PCRE (formot texte)
. http;//www.oreil ly.fr - Description du livre Moîtrise des expressions régulières (principe, moteursd'expressions régulières, optimisotion) - Jeffrey E. F. Friedl - éditions O'Reilly.
le booléen rrue, exec retourne un tableau de
quatre cases. Le remplacement fournit la date' r979-O7-21' , .
v a r d a t e = ' 2 1 - 4 1 - I 9 1 9 ' :
v a r e x p = / ^ ( \ d { 2 } ) - ( \ d { 2 } ) - ( \ d { a j l S / ;
a l e r L ( e x p . t e s t ( d a t e ) ) ;
v a r t a b = e x p . e x e c ( d a t e ) , '
v a r d a t e 2 = d a t e . r e p J - a c e ( e x p ,
a J J . a L | |
Ecrire des expressions POSIX est facile quand
on sait uti l iser les expressions PCRE. Une
grande partie de la syntaxe est identique : in-
dicateurs d'occurrence, caractères non impri-
mables, alternative, caractère d'échappement
\, mémorisation ou non des sous-expressions,
définition des classes avec [ ], [^ ] et [ - l. Ces
expressions s'écrivent sans délimiteur et sans
oçtion. Elles ne supportent pas les tests avant
et arrière, les conditions, les références arriè-
re dans I'expression, les quantificateurs pares-
seux, les abréviations de classes \d, \D, rw, r
w, \s et f s (i l faut uti l iser celles POSIX f ower,
upper, ...), les correspondances \A et \2, tn et \
B (u t i l i se r [ [ : < : ] I pou r \b e t t [ : > : ] I pou r \a ) .
Le point reconnaît toujours le \n. Les expres-
sions POSIX peuvent être util isées dans PHP
avec les fonc t ionsereg , e reg r , e reg rep race ,
e reg i _ rep lace , sp l i t e t spJ - i t i . I l es t éga le -
ment possible de les utiliser dans MySQL avec
l'opérateur relationnel REGEXP :
SELECT * FROM randonneur I I IHERE nom REGEXP
' ̂ O d I a e i o u y r ] + $ ' ;
Conc lus ionCet article vous a présenté la syntaxe des expres-
sions régulières et la manipulation de chaînes
de caractères avec ces expressions. Vous sa-
vez à présent créer des expressions régulières
et les utiliser pour vérifier qu'une chaîne suit
un motif pour découper des chaînes de caractè-
res, pour extraire des sous-chaînes et effectuer
des remplacements. Les expressions régulières
permettent de réaliser des opérations que les
fonctions de manipulation de chaînes classiques
de PHP ne peuvent pas effectuer. Vous pouvez
désormais util iser cet outiltrès puissant de ma-
nipulation de chaînes dans vos applications web
pour vérifier et manipuler les données issues de
formulaires.
MAGALI CONTENSIN, CECILE ODEROMogoli Contensin, outeur du livre Boses de données
et lnternet ovec PHP et MySQL, trovoille ou CNRS
et enseigne depuis sept ons le développement d'op-
plicotions Web à l'Université.
Co nto ct : htt p ://m o g o I i.c o nte n s i n. o n I i n e.f r.
Cécile Odero est spéciolisée dons lo conception et le
développement d'opplicotions Web en PH P/MySQL.
Elle trovoille en Angleterre dons lo socrété Fubro.
Co nto ct : ce c i le @f u b re.co m.