Articles - PHP

Site Web avec PHP et MySQL

  |   18025  |  PHP
Sommaire :

Les expressions r?guli?res



Nous allons utiliser les expressions r?guli?res de type PCRE issues du langage Perl.

Les fonctions qui nous int?ressent sont :
preg_grep ; preg_split ; preg_quote ; preg_match ; preg_match_all ; preg_replace ; preg_replace_callback.

Recherches simples



une regex (Expression r?guli?re) est toujours entour?e de caract?res sp?ciaux appel?s d?limiteurs.

Code PHP :
 
<?php
//Recherche du mot guitare
if (preg_match("#guitare#", "J'aime jouer de la guitare."))  echo 'VRAI';
else echo 'FAUX';
/*==========================================
//Recherche insensible ? la casse : utilisation de i
==========================================*/
if (preg_match("#guitare#i", "J'aime jouer de la guitare."))  echo 'VRAI';
/*==========================================
//Le symbole ou : |
==========================================*/
//Recherche du mot guitare ou piano
if (preg_match("#guitare|piano#", "J'aime jouer de la guitare."))  echo 'VRAI';
/*==========================================
//D?but (^) et fin($) de cha?ne
==========================================*/
if (preg_match("#^guitare#", "J'aime jouer de la guitare."))  echo 'VRAI'; //si la chaine commence par guitare
if (preg_match("#guitare$#", "J'aime jouer de la guitare."))  echo 'VRAI'; //si la chaine finit par guitare
if (preg_match("#^guitare$#", "J'aime jouer de la guitare."))  echo 'VRAI'; //La cha?ne doit contenir uniquement ? guitare ?
?>
 



Les classes de caract?res



#gr[io]s#: Une des lettres ? l'int?rieur peut convenir. Notre regex reconna?t deux mots : ? gris ? et ? gros ?.
#[aeiouy]$# : Notre regex se termine par une voyelle
[a-z] : Toutes les lettres de l'alphabet en minuscule
[a-e] : Les lettres de a ? e
[0-9] : Les chiffres de 0 ? 9.
[a-z0-9]. Cela signifie ? N'importe quelle lettre (minuscule) OU un chiffre ?.

Si vous ne voulez PAS des caract?res que vous ?num?rez dans votre classe, vous devrez placer le symbole ? ^ ? au d?but de la classe.

#[^0-9]# : Je ne veux pas de chiffre
#[^A-Z0-9]# : Ni majuscule, ni chiffre
#^[^a-z]# : Ne commence pas par une minuscule
#[^aeiouy]$#: Ne se termine pas par une voyelle

Les quantificateurs



Trois symboles ? retenir :

? (point d'interrogation) : La lettre est facultative. Elle peut y ?tre 0 ou 1 fois. Ainsi, #a?# reconna?t 0 ou 1 ? a ? ;
+ (signe plus) : la lettre est obligatoire. Elle peut appara?tre 1 ou plusieurs fois. Ainsi, #a+# reconna?t ? a ?, ? aa ?, ? aaa ?, ? aaaa ?, etc. ;
* (?toile) : la lettre est facultative. Elle peut appara?tre 0, 1 ou plusieurs fois. Ainsi, #a*# reconna?t ? a ?, ? aa ?, ? aaa ?, ? aaaa ?, etc. Mais s'il n'y a pas de ? a ?, ?a fonctionne aussi !

?tre plus pr?cis gr?ce aux accolades



{3} : la lettre (ou le groupe de lettres s'il est entre parenth?ses) doit ?tre r?p?t?e 3 fois exactement.
#a{3}# fonctionne donc pour la cha?ne ? aaa ?.

{3,5} : ici, on a plusieurs possibilit?s. On peut avoir la lettre de 3 ? 5 fois.
#a{3,5}# fonctionne pour ? aaa ?, ? aaaa ?, ? aaaaa ?.

{3,} : si vous mettez une virgule, mais pas de 2e nombre, ?a veut dire qu'il peut y en avoir jusqu'? l'infini. Ici, cela signifie ? 3 fois ou plus ?.
#a{3,} fonctionne pour ? aaa ?, ? aaaa ?, ? aaaaa ?, ? aaaaaa ?, etc.



Si vous faites attention, vous remarquez que :
? revient ? ?crire {0,1} ;
+ revient ? ?crire {1,} ;
* revient ? ?crire {0,}.


Les caract?res sp?ciaux



# ! ^ $ ( ) [ ] { } ? + * . \ |

Pour les ?chapper dans une expression recherch?e, Il va falloir l'?chapper. Cela signifie que vous devez placer en fait un antislash ? \ ? devant un caract?re sp?cial.

Et si vous voulez ajouter le tiret dans la liste des caract?res possibles ? Eh bien il suffit de le mettre soit au d?but de la classe, soit ? la fin. Par exemple : [a-z0-9-] permet de chercher une lettre, un chiffre ou un tiret.

Capture et remplacement



Nous allons utiliser la fonction preg_replace pour capturer et remplacer une cha?ne. La cha?ne ? capturer est mise entre parenth?se.

Exemple:
#\[b\](.+)\[/b\]# : Chercher dans la cha?ne un [ b ], suivi d'un ou plusieurs caract?re(s) (le point permet de dire ? n'importe lesquels ?), suivi(s) d'un [ /b ]

A chaque fois qu'il y a une parenth?se, cela cr?e une variable appel?e $1 (pour la premi?re parenth?se), $2 pour la seconde, etc.
On va ensuite se servir de ces variables pour modifier la cha?ne (faire un remplacement).


Code PHP :
 
<?php
//Met en gras les mots plac?s entre [b][/b]
$texte = preg_replace('#\[b\](.+)\[/b\]#i', '<strong>$1</strong>', $texte);
?>
 


Les options
i : pour accepter les majuscules comme les minuscules ([B ] et [b ]) ;
s : pour que le ? point ? fonctionne aussi pour les retours ? la ligne (pour que le texte puisse ?tre en gras sur plusieurs lignes) ;
U : le U majuscule est une option que vous ne connaissez pas et qui signifie ? Ungreedy ? (? pas gourmand ?). Sachez que, grosso modo, ?a ne marcherait pas correctement s'il y avait plusieurs [b ] dans votre texte.? sans activer l'option Ungreedy, la regex aurait voulu mettre en gras tout ce qu'il y a entre le premier [b ] et le dernier [/b ].

Code PHP :
 
<?php
$texte = preg_replace('#\[b\](.+)\[/b\]#isU', '<strong>$1</strong>', $texte);
$texte = preg_replace('#\[i\](.+)\[/i\]#isU', '<em>$1</em>', $texte);
?>
 



Licence - Pas d?Utilisation Commerciale - Partage dans les M?mes Conditions
Licence Creative Commons