En résumé, les expressions régulières servent à récupérer une ou plusieurs sous-chaîne de caractères d'une chaine de caractères.
Pour une conversion regexp <-> english, voir le site https://www.autoregex.xyz/. Merci Sullyvan qui cherche une alternance à partir d'avril 2023.
Une fois que l'on a identifié cette ou ces sous-chaines, on peut soit les utiliser :
- à notre guise (pour les affecter à une variable par exemple)
- pour les remplacer par d'autres sous chaînes de caractères dans la chaîne de caractère initiale
Structure d'une expression régulière (regular expression ou regex)
Une regex est entourée de symboles appelés délimiteurs. On peut choisir le caractère que l'on veut. Nous utiliserons "~".
Pattern
Les sous chaines recherchées peuvent être des chaînes de caractères classiques comme "hello" mais on peut aller beaucoup plus loin en utilisant des "pattern".
Exemple de pattern : "~<(h\d|span){1}[^>]*>{1}(.*)</[^>]+>{1}~"
On comprend donc qu'il va falloir utiliser des caratères qui ont un sens particulier. Ces caractères sont appelés des :
- classes de caractères
- quantificateurs
- métacaractères
Classes de caractères
regex |
Explication |
---|---|
|
Chaîne qui contient « gris », ou « gros », ou « gras ». |
|
Caractères minuscules de a à z. |
|
Chiffres de 0 à 9. |
|
Lettres de « a » à « e » ou chiffres de 0 à 9. |
|
Chiffres de 0 à 5, ou 7, ou lettres majuscules, ou lettres minuscules, ou un point, ou un tiret. |
|
Chaîne ne contenant PAS de chiffres. |
|
Chaîne ne commençant PAS par un chiffre. |
Quantificateurs
regex |
Explication |
---|---|
|
« a » peut apparaître 0 ou 1 fois. |
|
« a » doit apparaître au moins 1 fois. |
|
« a » peut apparaître 0, 1 ou plusieurs fois. |
|
« bois » ou « boris ». |
|
Fonctionne pour Ay, Ayay, Ayoy, Ayayayoyayayoyayoyoyoy, etc. |
|
« a » doit apparaître 3 fois exactement (« aaa »). |
|
« a » doit apparaître de 3 à 5 fois (« aaa », « aaaa », « aaaaa »). |
|
« a » doit apparaître au moins 3 fois (« aaa », « aaaa », « aaaaa », « aaaaaa », etc.). |
Métacaractères
# ! ^ $ ( ) [ ] { } | ? + * .
regex |
Explication |
---|---|
~yadlarumbadanslair~ |
Cherche le mot « yadlarumbadanslair » dans la chaîne. |
~ping|pong~ |
Cherche le mot « ping » OU « pong ». |
~^hello~ |
La chaîne doit commencer par « hello ». |
~boy$~ |
La chaîne doit se terminer par « boy ». |
~^Ca va Raymond$~ |
La chaîne doit contenir uniquement « Ca va Raymond ». |
\b(?:[a-eg-z]|f(?!oo))\w*\b // Word not starting with foo |
Negative Lookahead: Matches only if not followed by something |
Échapper (belle)
Pour utiliser un métacaractère dans une recherche, il faut l'échapper avec un antislash : \
.
regex |
Explication |
---|---|
~Toto?~ |
Cherche « Tot » ou « Toto ». |
~Toto\?~ |
Cherche « Toto? ». |
Flag
Il existe plusieurs "flags" qui viennent paramétrer notre expression régulière.
Les "flags" s'ajoutent en fin d'expression. Ex : ~yadlarumbadanslair~i
- i : rend l'expression insensible à la casse (majuscule ou majuscule)
- s : le métacaractère point (.) remplace n'importe quel caractère, y compris les nouvelles lignes
- ...
Méthodes php
Voici les méthodes php à utiliser avec des expressions régulières :
Fonction | Description |
---|---|
preg_match() | recherche un motif dans la chaîne de caractères, retourne true si le motif existe, et false sinon. |
preg_match_all() | Effectue une recherche globale sur toutes les occurrences du motif dans la chaîne. Utile pour la recherche et le remplacement. |
preg_replace() | Effectue une recherche et un remplacement d’expressions régulières. |
preg_grep() | recherche tous les éléments du tableau d’entrée, retournant tous les éléments correspondant au motif regex dans une chaîne. |
preg_split() | Divise une chaîne de caractères en chaînes de caractères en utilisant une expression régulière. |
preg_quote() | Cite les caractères d’expression régulière trouvés dans une chaîne. |
- https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/918834-memento-des-expressions-regulieres
- http://www.expreg.com/memo.php
Exercice 1 :
Utilisez la fonction preg_match pour trouver si une url est de type /node/xxx ou /node/xxx/edit où xxx est un nombre entier naturel.
Exemple d'url : http://www.coopernet.fr/node/158
Exercice 2 :
Soit la chaîne de caractère suivante :
$link = '<a class="subscriber toto" href="http://www.coopernet.fr" title="Hello the World">Hello World</a>';
En partant du principe qu'il faut remplacer la classe "subscriber" ou "premium" ou "anonymous" par "master", utilisez la fonction preg_replace de façon à obtenir :
<a class="master toto" href="http://www.coopernet.fr" title="Salut le monde">Salut le monde</a>
$link = '<a href="subscriber toto" title="Hello the World">Hello World</a>'; $patterns[0] = "~premium|subscriber|anonymous~"; $replacements[0] = "master"; $patterns[1] = '~title="[^"]*"~'; $replacements[1] = 'title="Salut le monde"'; $patterns[2] = '~>[^<]*</a>~'; $replacements[2] = '>Salut le monde</a>'; $link = preg_replace($patterns, $replacements, $link); echo $link;