Aller au menu - Aller au contenu

Icône Memento des expressions régulières

Mise à jour : 03/04/2010
Difficulté : Facile Facile Creative Commons BY-NC-SA
133 390 visites depuis 7 jours, dont 1 324 sur ce chapitre classé 2/786
Cette annexe va être utile à ceux qui ont lu les 2 chapitres sur les expressions régulières. Il s'agit d'un memento, c'est-à-dire d'un résumé qui vous sera utile lorsque vous écrirez vos propres regex.

Gardez cette page dans un coin, ou, mieux, imprimez-la. Elle vous servira de support pour vous rappeler toutes les possibilités des regex.

Cette annexe n'est PAS faite pour apprendre à se servir des regex. Si vous voulez apprendre, allez voir les chapitres correspondants dans le cours.
Ici, les explications sont succinctes car le but est de synthétiser au maximum tout ce qu'il y a à savoir sur les regex.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire

Structure d'une Regex

Une Regex est entourée de symboles appelés délimiteurs. On peut choisir ce qu'on veut, nous nous utilisons le dièse.
Une Regex a la forme suivante :
#Regex#Options


Pour tester une chaîne à partir d'une Regex, on utilise preg_match :

Code : PHP
1
<?php preg_match("regex","chaine"); ?>


Regex Explication
#guitare# Cherche le mot "guitare" dans la chaîne
#guitare|piano# Cherche le mot "guitare" OU "piano"
#^guitare# La chaîne doit commencer par "guitare"
#guitare$# La chaîne doit se terminer par "guitare"
#^guitare$# La chaîne doit contenir uniquement "guitare"

Classes de caractères

Regex Explication
#gr[ioa]s# Chaîne qui contient "gris", ou "gros", ou "gras"
[a-z] Caractère minuscule de a à z
[0-9] Chiffre de 0 à 9
[a-e0-9] Lettre de "a" à "e" ou chiffre de 0 à 9
[0-57A-Za-z.-] Chiffre de 0 à 5, ou 7, ou lettre majuscule, ou lettre minuscule, ou un point, ou un tiret
#[^0-9]# Chaîne ne contenant PAS de chiffre
#^[^0-9]# Chaîne ne commençant PAS par un chiffre

Quantificateurs

Regex Explication
#a?# "a" peut apparaître 0 ou 1 fois
#a+# "a" doit apparaître au moins 1 fois
#a*# "a" peut apparaître 0, 1 ou plusieurs fois
#bor?is# "bois" ou "boris"
#Ay(ay|oy)*# Fonctionne pour Ay, Ayay, Ayoy, Ayayayoyayayoyayoyoyoy etc...
#a{3}# "a" doit apparaître 3 fois exactement ("aaa")
#a{3,5}# "a" doit apparaître de 3 à 5 fois ("aaa", "aaaa", "aaaaa")
#a{3,}# "a" doit apparaître au moins 3 fois ("aaa", "aaaa", "aaaaa", "aaaaaa" etc...)

Métacaractères

Les métacaractères sont :
# ! ^ $ ( ) [ ] { } | ? + * . \


Pour utiliser un métacaractère dans une recherche, il faut l'échapper avec un antislash : \

Regex Explication
#Hein?# Cherche "Hei" ou "Hein"
#Hein\?# Cherche "Hein?"


Les métacaractères n'ont pas besoin d'être échappés dans une classe, sauf pour "#" (symbole de fin de la regex), "]" (symbole de la fin de la classe) et "\" (si votre classe recherche un antislash) que l'on doit faire précéder d'un antislash.

Si on veut rechercher un tiret dans une classe de caractères, il faut le placer au début ou à la fin de la classe : [a-zA-Z0-9-]

Classes abrégées

Classe abrégée Correspondance
\d [0-9]
\D [^0-9]
\w [a-zA-Z0-9_]
\W [^a-zA-Z0-9_]
\t Tabulation
\n Nouvelle ligne
\r Retour chariot
\s Espace blanc (correspond à \t \n \r)
\S Ce qui n'est PAS un espace blanc (\t \n \r)
. Classe universelle

Le point est la classe universelle : il signifie "n'importe quel caractère".

Capture et remplacement

En utilisant la fonction preg_replace on peut automatiquement faire des remplacements à l'aide de Regex.

Code : PHP
1
2
3
<?php
$texte = preg_replace('#\[b\](.+)\[/b\]#i', '<strong>$1</strong>', $texte);
?>
  • Les parenthèses servent à entourer un bout de la Regex pour créer des variables $1, $2, $3 etc... Qui seront utiles pour faire le remplacement
  • Il peut y avoir jusqu'à 99 parenthèses capturantes, donc jusqu'à $99
  • (?:texte) est une parenthèse non capturante : elle ne crée pas de variable.
  • Une variable $0 est toujours créée et correspond à l'ensemble de la Regex.
Ainsi, la Regex suivante...
#(anti)co(?:nsti)(tu(tion)nelle)ment#
... crée les variables suivantes :
  • $0 : anticonstitutionnellement
  • $1 : anti
  • $2 : tutionnelle
  • $3 : tion

Options

Il existe de nombreuses options que l'on peut utiliser avec les Regex PCRE.
Parmi les 3 que nous sommes amenés le plus souvent à utiliser, il y a :
  • i : la Regex ne fera plus la différence entre majuscules / minuscules.
  • s : le point (classe universelle) fonctionnera aussi pour les retours à la ligne (\n)
  • U : mode "Ungreedy" (pas gourmand). Utilisé pour que la Regex s'arrête le plus tôt possible. Pratique par exemple pour le bbCode [b][/b] : la Regex s'arrêtera à la première occurence de [/b]
Voilà !
En espérant que ce petit Mémo serve au maximum d'entre vous... Il faut dire qu'il y a tellement de choses à retenir avec les Regex qu'un petit appui comme celui-ci ne peut pas faire de mal. ^^
Chapitre précédent Sommaire

Partager

45 commentaires pour "Memento des expressions régulières"
Note moyenne : 3.61 / 4 (2518 votes)
Pseudo Commentaire
Hors ligne kevin-77 # Posté le 22/05/2011 à 18:27:59

BRAVO !!!!!!
:)

XHTML / CSS : 100%
PHP / MySQL : 90%
VB .NET : 60%
Photoshop : 50%
Blender : 70%
Maya : 15%
 
Hors ligne Acolyte # Posté le 05/07/2011 à 22:54:28
pouack-pouack
Avatar

Études : IUT Pays de l'Adour

Bonjour,

Très pratique cependant, il manque une chose pour un mémento. Le code de retour ?

Là, je viens de chercher "expressions régulières", je tombe sur le mémento et aucune indication sur le retour de preg_match (obligé de relire le cours [meuh... si je m'en souvenais mais je voulais être sûr :p ])...

Donc même si cette page n'a pas pour vocation d'être un cours sur les REGEX, tu nous précise

Citation : M@teo21
Pour tester une chaîne à partir d'une Regex, on utilise preg_match :


Je rajouterai donc le résultat de la fonction preg_match,
true si le regex est validé
false si le regex n'est pas validé.

Et sinon et bien gG :D !

10ième LDZ reçu !! :p
 
Hors ligne Gil8925 # Posté le 07/09/2011 à 13:48:17

Bonjour,

Cela fait quelques années que je consomme des tutos du SDZ, et en particulier ceux de M@teo21. Après avoir fait HTML et CSS, je viens de terminer PHP et MySQL.

Je dois un grand grand merci à M@teo21, en particulier, au SDZ, en général, et à tous ceux qui y participent offrant gratuitement un savoir utile à tous.

De plus la qualité des tutos que j'ai étudiés est exemplaire et constitue un modèle de démocratisation du savoir.

Bravo !
Hors ligne SdaliM # Posté le 22/12/2011 à 21:40:34
Je suis niveau 2! Talatatatala
Avatar

Avis : Très bon

Trop pratique ce mémo ! Super !

Je voulais encore une fois dire à quel point je trouve tes cours bien faits M@ateo21 !

SdaliM

DONJON DE NAHEULBEUK : Une saga d'aventures débiles en mp3
 
Hors ligne webalorn # Posté le 11/05/2012 à 20:43:02
Avatar

Très bon tuto! Bravo!!! J'y ais apris plus de choses que je ne l'avais espéré. :)

Voir tous les commentaires