[PHP] Les expressions régulières


Par Worm Imprimer le tutorial Voir son profil

1) Introduction



Bonjour chat.gif

Les expressions régulières (ou regex) permettent de définir des "motifs" ou "modèles" que l'on peut ensuite rechercher dans une chaine de caractères. Par exemple l'opérateur LIKE de SQL.

Elles autorisent une recherche puissante. Elles indiquent d'une part le(s) caractère(s) recherchées dans la chaîne, et en spécifiant d'autre part dans quel ordre et avec quel nombre ces caractères doivent apparaître.

On utilise plusieurs symboles pour indiquer la postition et le nombre de fois que ces caractères doivent apparaître.

2) Les symboles d'occurences




^ permet d'indiquer le début de la chaine: l'expression ^mot s'applique donc a toutes les chaines commencant par mot

$ indique la fin de la chaîne: l'expression $mot s'applique donc a toutes les chaînes se terminant par mot

m* le motif m peut etre présent 0 ou plusieurs fois.

m+ indique que le motif m peut etre présent une (au moins) ou plusieurs fois.

m? indique que le motif m peut etre présent 0 ou 1 fois.

m{a,b} indique que le motif m peut etre présent au moins a fois et au plus b fois.


Ici nous avons m qui est définie comme motif mais cela avait été mot, il aurait fallu penser a mettre les parenthèses (mot) sinon on aurait recherché les chaines qui contiennent mo suivit de un ou plusieurs t


[mot] toutes les chaines avec un m, un e ou un r.

[a-f] toutes les chaines avec une des lettres entre a et f.

[a-zA-Z] toutes les chaines avec une lettre de l'alphabet.

[^0-9] toutes les chaines sans chiffre.

Ensuite pour simplifier l'ecriture des expressions, certains mot-clés représentent des classes courantes de caractères. Ils doivent apparaitre dans une expression régulière encadré par : pour éviter toute ambiguité. Par exemple :alpha:. Attention ces raccourcis ne sont pas valables pour les regex utilisant la syntaxe PERL.

:alpha: n'importe quel caractère alphanumérique
:blank: espaces et tabulations
:cntrl: tous les caractères ayant une valeur ASCII inférieure à 32
:lower: toutes les minuscules
:upper: toutes les majuscules
:space: espaces, tabulations et retours à la ligne
:xdigit: chiffres en hexadécimal

Concernant uniquement les expressions régulières PERL, il existe des raccourcis correspondants à certains groupes et leurs opposés.

d représente un chiffre
D représente tout sauf un chiffre
w représente tout caractère alphanumérique
W représente tout sauf un caractère alphanumérique
s représente un espace ou une tabulation
S représente tout sauf un espace ou une tabulation

Enfin, le point "." représente n'importe quel caractère le point comme tous les caractères spéciaux que nous avons vu doivent etre précédé par un pour etre pris en compte d'une manière littérale dans une expression régulière.

3) Application avec PHP



Les deux principales fonctions en PHP pour traiter des expressions régulières sont les fonctions ayant pour préfixe ereg_ et preg_. La majorité des gens préfèrent utiliser preg_ qui utilise la syntaxe des expressions rationnelles compatibles PERL plus répandue que ereg_ utilisant la syntaxe POSIX.

Syntaxe de ereg()

ereg ( motif, chaine à laquelle on souhaite apliquer motif , tableau des résultats )
Le dernier paramètre est falcutatif


Voici un petit exemple où l'on verifiera si l'utilisateur place des balises html dans les chaines de caractères.

Voyons d'abord l'expression régulière représentant une balise.
Il s'agit de toute chaine commencant par "<" suivi de un ou plusieurs caracères alphanumériques à l'exception de ">", et se terminant par ">". Voici donc l'expression:

<[^>]+>


En effet, si le premier caractère entre crochet est ^ , l'interprétation est inversée: l'expression s'applique a toutes les chaines qui ne contiennent pas un des caractères, ici ">".

Voici donc le code correspondant :

<?php

$texte = "<b> Test </b>";

if(ereg("<[^>]+>",$texte))
echo"Votre texte comporte des balises HTML";
?>


Ne nous attardons pas trop sur ereg, passons à l'alternative preg qui est beaucoup plus utilisée.

Syntaxe de preg_match

La fonction preg_match() va nous permettre de tester la présence d'une chaine de caractères de forme particulière dans un texte.

preg_match(motif, chaine à laquelle on souhaite apliquer motif)


Il existe plusieurs paramètres optionnels, ici nous tiendrons uniquement compte des deux premiers paramètres. Reprenons ansi notre exemple, qui servira à détecter la présence d'une balise dans une chaîne de caractères.

<?php

$texte = '<b> Test </b>';

if(preg_match("/<[^>]+>/",$texte))
echo "Votre texte comporte des balises HTML";
?>


Vous remarquez ici la présence de deux / en début et fin de motif, c'est comme cela que s'ecrivent les expressions régulières en PERL, et donc preg_match utilise cette syntaxe.

Syntaxe de preg_replace

preg_replace ( motif, chaîne qui remplacera le motif , chaîne dans la quelle on remplace le motif )


La fonction preg_replace() va nous permettre de rechercher une chaîne grace au motif et de la remplacer par une autre. Ici, nous remplaceront toutes les balises par des balises BBcode. Par exemple <b> sera remplacé par [b].

<?php
$texte = '<b> Test </b>';

$texte_bbcode = preg_replace("/<([^>]+)>/","[$1]",$texte);
?>

Nous avons ajouté des parenthèses capturantes autour de [^>]+qui permettent "d'enregistrer" la chaîne de caractères, pour ainsi la réutiliser dans le deuxième argument sous forme de $1.

Afin de mieux comprendre cette notin, ici un exemple ayant pour but de remplacer adresse e-mail par un lien équivalent.

<?php
$mail = "nom@domaine.com";
$regex = "/(w*)@(w*).([A-Za-z]{2,4})/";

preg_replace($regex,"<a href='mailto:$1@$2.$3'>$1</a>",$mail);
?>

Ici nous avons 3 parenthèses capturantes nous les réutilisons sous forme de variables en fonction de leur ordre d'apparition.

Conclusion


Ce tutorial ne représente que quelques notions des expressions régulières et vous permettra déjà de faire pas mal de choses clindoeil.gif
Si vous souhaitez approfondir un peu plus le sujet, je ne saurais vous conseillez cette documentation sur les expressions régulières en PERL.
« Trouve un travail qui te plaît et plus jamais tu ne travailleras » Confucius


Aucun commentaire(s)

Pas de commentaire pour ce tutorial.

Ajouter un commentaire

Vous devez vous être connecté pour poster des commentaires