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 :
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 :
#!ˆ$()[]{}?+*.\|
Le point d'exclamation est un métacaractère dans la mesure où on s'en sert de délimiteur.
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) et "
]" (symbole de la fin de la classe) 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 mettre 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 &agarve; \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 remplacement à l'aide de Regex.
Code PHP
<?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
- (?:truc) 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²eacute;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]