PDF Imprimer Envoyer

Expressions Régulières

Les expressions régulières, couramment appelées expressions rationnelles, regexp ou regex sont utilisées couramment dans le monde de l'informatique. Ces expressions servent à caractériser facilement des suites de caractères précises. Une expression régulières va permettre de caractériser un ensemble de chaînes de caractères qui répond à la regexp écrite.

L'utilisation des expressions régulières est assez bien documentée sur le net. Nous traiterons uniquement ici de quelques bases nécessaires à l'URL rewriting.

Vous êtes sans doute familié avec le caractère joker * qui vous permet de remplacer n'importe quel suite de caractère lors d'une recherche sur internet par exemple. Les expressions régulières sont en quelque sorte une extension codifié de cet outil. Elles sont en même temps plus puissantes (on peut préciser la chaîne voulue) et plus difficile à rédiger (d'où l'intérêt de cet article). Mais accrochez-vous et retenez seulement le nécessaire. Tout se passera bien.
 
Dans la partie consacrer à la réécriture d'URLs de base nous avions utilisé l'exemple d'une page dynamique affichant un article. Replaçons-nous dans ce contexte, et supposons que nous voulions atteindre la page /article.php?id=24 par l'URL /article/24-article-titre.html. Pour cela, il nous faut une expression rationnelle qui permette de sélectionner cette chaîne de caractère dans l'adresse demandée.
 
Bien sur on peut mettre comme chaîne recherchée la chaîne elle-même : 
/article/24-article-titre.html
Mais avec cela on ne va pas très loin, et on devra rajouter une ligne à chaque nouvel article. Cependant, il s'agit bien d'une expression régulière qui est vrai lorsque l'adresse demandée est l'adresse ci-dessus. Par exemple, l'expression régulière a va ne renvoyer vrai que lorsque la chaîne demandée est a. Elle renverra faux dès qu'on lui demandera b ou c.
 
Dans la suite de l'article on voit justement comment complexifier et améliorer le schéma de recherche d'expression.

 

Syntaxe

Valeurs possibles:

  • a : ou b ou abracadabra. L'expression ne sera valide que si la chaîne donnée vaut exactement la chaîne en entrée.
  • . : remplace un unique caractère. Le point remplace n'importe quel caractère. a. peut marcher pour aa, ab, ac ... a1, a2, a? etc.
  • [ ] : les crochets permettent de définir un cactère dans un ensemble donné. Par exemple [a-z] marchera pour n'importe quelle lettre minuscule donnée en entrée. De même, [0-9] fonctionnera pour tout chiffre. On peut aussi donnée un ensemble de caractère valides : [dhji57] sera vérifié si l'on envoie d ou 5 par exemple. Vous pouvez aussi utiliser des combinaisons comme [a-g0-9p] qui sera valide pour tout caractère minuscule entre a et g, pour p et pour tout chiffre.
  • [^] : en rajoutant le caractère ^ devant une suite de caractères, vous fixer les valeurs à ne pas accepeter. Ainsi [a-z^hij] sera valide pour tout caractère minuscule exceptés h, i et j.

Délimiteurs:

  • ^ : définit le début de la chaîne de caractère
  • $ : définit la fin de la chaîne de caractère

"pommes" tout seul marchera pour "j'aime les pommes", "Pas de pommes svp" ou "pommes pom paume".

"^pommes" indique que la chaîne doit débuter par pommes. "pommes pom paume" marchera, mais pas les autres.

"pommes$" indique que la chaîne doit se finir par pommes. "J'aime les pommes" marchera.

"^pommes$" ne conviendra que pour la chaîne de caractère "pommes".

Jokers:

Jusqu'à présent nous avions seulement vérifier une suite connue de caractère. Voyons maintenant comment rechercher une  chaîne de caractère dont certains sont inconnus: les caractères joker!

  • * signifie 0 ou plusieurs répétitions de l'expression précédente. Ainsi "go*gle" marchera pour "ggle", "gogle", "google", "gooogle" etc.
  • + signifie 1 ou plusieurs répétitions de l'expression précédente
  • ? signifie 0 ou 1 fois l'expression précédente. "pommes?" marchera pour "pomme" et "pommes".

Le choix:

Le symbole séparateur | (obtenu en tapant "alt Gr + 6") sert à donner une liste de valeurs possibles. "rouge|red" marchera pour "rouge" ou pour "red".

Les parenthèses ou accolades permettent de regrouper des suites de caractères pour le choix. Par exemple "r(ouge)|(ed)" pour l'exemple précédent.

Echapper les caractères spéciaux

Commes les caractères .+*^$[]() sont tous utilisés pour construire les règles des expressions régulières, il faut trouver une solution pour pouvoir les utiliser en tant que caractères et non plus en tant que règles d'expression régulière. La solution retenue consiste à échapper ces caractères spéciaux. Cela signifie que l'on rajoute devant chacun de ces caractères le caractère \ (obtenu en faisant "Alt Gr + 8").

Admettons par exemple que vous vouliez vérifier que la chaîne ".html" soit présente (pour vérifier l'appel d'un fichier html) le test suivant sera faux : ".html" en effet, celui-ci demande à Apache Mod-Rewrite de vérifier les chaînes "ahtml", "bhtml" ... "4html" etc. Alors que en cherchant "\.html" vous n'obtiendrez que les requêtes qui sont ".html".

Exemple

Retournons à notre exemple initial. Nous pouvons à présent chercher une expression bien plus performante qui vérifie tous les articles possibles, et tout titre possible dans l'URL. Le principe est le suivant : on vérifie d'abord qu'il s'agit d'une page article-id-titre.html, et on ne conservera en variable que l'id de l'article. C'est lui qui nous servira à afficher le vrai article (en affichant article.php?id=$id). Le titre de l'article ne servira pas à l'article, mais seulement aux visiteurs et aux moteurs de recherche pour mieux indexer notre page :

^article-/([0-9]+)-(.*)\.html$

Voyons pas à pas ce que fait cette expression. Tout d'abord on vérifie que les délimiteurs (^ et $) encadrent bien une adresse URL classique. En effet, dans une Rewrite Rule avec Apache mod-Rewrite, il n'est pas demandé de mettre le nom de domaine devant l'URL redirigée (pas de http://monsite.com/url_a_rediriger.html par exemple).On vérifie ensuite que la page demandée estbien un article par "article-". On récupère ensuite la chaine suivante qui doit s'écrire sous forme d'au moins un chiffe, mais aussi grand qu'on veut "[0-9]+". Rappelez-vous que les parenthèses sont là pour récupérer la chaine. Après cela on doit trouver un tiret puis le nom de l'article : "-(.*)". remarquez ici l'astuce pour définir une chaîne quelconque de longueur quelconque, le point suivit de l'astérisque. Enfin on vérifie que l'adresse se finit bien par un .html.

Allre plus loin :

Pour ceux qui veulent utiliser les expressions réguilères de manières plus abouties dans les scripts php (de réécriture par exemple) apache-mod-rewrite vous conseille le site expreq.com : http://www.expreg.com. Ce site suppose néanmoins une connaissance du langage php.

Mise à jour le Mardi, 11 Novembre 2008 11:45
 

Commentaires 

 
+5 # jp 07-07-2011 21:38
Merci
1 des rares sites en Français, précis et clair
Répondre | Répondre en citant | Citer
 

Ajouter un Commentaire


Code de sécurité
Rafraîchir