Expressions Regulieres PHP.

Table of Contents

Les expressions jouent un rôle très important dans le traitement de chaînes. Elles permettent de vérifier la validité des chaînes de caractères, comme la vérification d’un email ou de saisies chiffrées, et elles peuvent également être utilisées pour traiter des éléments à l’intérieur d’une chaîne, tels que l’extraction ou le remplacement.

Il existe deux types d’expressions utilisées avec PHP : POSIX et PCRE (Perl Compatible Regular Expression). Les expressions PCRE (héritées de Perl) sont bien plus puissantes que les POSIX. Nous utiliserons ce type pour notre tutoriel.

La fonction preg_match() vérifie si le format d’une chaîne correspond à un motif (ou masque). Elle fonctionne avec deux paramètres : le motif et la chaîne à traiter en deuxième paramètre. La fonction retourne false si le format de la chaîne ne correspond pas au motif.

<?php
        $chaine = "daniel";
        $motif="/dan/"; // motif 'dan'
        if(preg_match($motif,$chaine)){
            echo "format correct";
        }else{
            echo "format incorrect";
        }
        ?>

Affichage :

format correct

Dans cet exemple, la fonction preg_match() trouve le motif ‘dan’ dans la chaîne et retourne ‘format correct’.

Pour déclarer la chaîne motif, il faut l’encadrer par des délimiteurs. Les délimiteurs les plus courants sont les slashes (/), dièses (#) et les tildes (~). Ici, nous utilisons les slashes ‘/’.

<?php
        $motif1 = '/ /';
        $motif2 = '# #';
        $motif3 = '~ ~';
        ?>

Échappement dans le motif

Si le motif utilise le même caractère que les délimiteurs, il faudra échapper tous les caractères présents dans le motif avec le backslash ‘\’.

<?php
        $motif1 = '/3\/2/'; // échappement nécessaire
        $motif2 = '#3/2#'; // pas besoin d'échappement
        ?>

La fonction preg_quote() peut être utilisée pour échapper une chaîne et l’utiliser dans un motif. Les caractères spéciaux qui seront protégés sont les suivants : \ + * ? [ ^ ] $ ( ) { } = ! < > | : –

<?php
        $motif="\ + * ? [ ^ ] $ ( ) { } = ! < > | : - /";
        $motif = preg_quote($motif,"https://tutowebdesign.com/"); // le second paramètre protège le "https://tutowebdesign.com/" ignoré par défaut
        echo $motif;
        ?>

Affichage :

\\ \+ \* \? \[ \^ \] \$ \( \) \{ \} \= \! \< \> \| \: \- \/

Son second paramètre optionnel sert à spécifier le délimiteur qui doit être également échappé, comme ‘/’ qui est très utilisé comme délimiteur.

Les caractères spéciaux

Dans les expressions régulières, certains caractères ont une signification spéciale et doivent être échappés ou utilisés avec précaution :

  • . : Correspond à n’importe quel caractère, sauf un saut de ligne.
  • [ ] : Définit une classe de caractères. Par exemple, [aeiou] correspond à n’importe quelle voyelle.
  • [^ ] : Définit une classe de caractères négative. Par exemple, [^0-9] correspond à tout caractère qui n’est pas un chiffre.
  • * : Correspond à zéro ou plusieurs occurrences du caractère précédent. Par exemple, "a*" correspond à "aa" ou "a".
  • + : Correspond à une ou plusieurs occurrences du caractère précédent. Par exemple, "a+" correspond à "aa" mais pas à "a".
  • ? : Correspond à zéro ou une occurrence du caractère précédent. Par exemple, "a?" correspond à "a" ou à une chaîne vide.

Les ancres

Les ancres permettent de spécifier le début et la fin d’une chaîne :

  • ^ : Correspond au début de la chaîne.
  • $ : Correspond à la fin de la chaîne.
<?php
        $chaine = "Bonjour, comment ça va ?";
        $motif = '/^Bonjour/'; // commence par "Bonjour"
        if(preg_match($motif, $chaine)){
            echo "La chaîne commence par Bonjour.";
        }else{
            echo "La chaîne ne commence pas par Bonjour.";
        }
        ?>

Affichage :

La chaîne commence par Bonjour.

Dans cet exemple, la fonction preg_match() recherche le motif ‘^Bonjour’ au début de la chaîne, et elle le trouve.

Les quantificateurs

Les quantificateurs permettent de spécifier le nombre d’occurrences d’un caractère ou d’un groupe :

  • {n} : Correspond exactement à n occurrences.
  • {n,} : Correspond à n occurrences ou plus.
  • {n,m} : Correspond à au moins n occurrences et au plus m occurrences.
<?php
        $chaine = "aaaaa";
        $motif = '/a{2,4}/'; // de 2 à 4 'a'
        if(preg_match($motif, $chaine)){
            echo "La chaîne contient entre 2 et 4 'a'.";
        }else{
            echo "La chaîne ne contient pas entre 2 et 4 'a'.";
        }
        ?>

Affichage :

La chaîne contient entre 2 et 4 'a'.

Le motif ‘/a{2,4}/’ signifie qu’il doit y avoir entre 2 et 4 ‘a’ dans la chaîne.

Les classes prédéfinies

Il existe des classes prédéfinies pour des caractères couramment utilisés :

  • \d : Correspond à un chiffre.
  • \D : Correspond à un caractère qui n’est pas un chiffre.
  • \w : Correspond à un caractère alphabétique (lettre) ou un chiffre.
  • \W : Correspond à un caractère qui n’est ni alphabétique ni un chiffre.
  • \s : Correspond à un espace blanc (espace, tabulation, retour à la ligne, etc.).
  • \S : Correspond à un caractère qui n’est pas un espace blanc.

Les groupes

Les groupes permettent de regrouper des caractères et d’appliquer des quantificateurs à l’ensemble :

<?php
        $chaine = "aaaaab";
        $motif = '/(a{2})b/'; // deux 'a' suivis de 'b'
        if(preg_match($motif, $chaine)){
            echo "Le motif est présent dans la chaîne.";
        }else{
            echo "Le motif n'est pas présent dans la chaîne.";
        }
        ?>

Affichage :

Le motif est présent dans la chaîne.

Dans cet exemple, le motif ‘(a{2})b’ signifie deux ‘a’ suivis de ‘b’.

Les alternatives

Les alternatives permettent de spécifier plusieurs motifs possibles :

<?php
        $chaine = "Bonjour";
        $motif = '/(Bonjour|Salut)/'; // soit 'Bonjour' soit 'Salut'
        if(preg_match($motif, $chaine)){
            echo "Le motif est présent dans la chaîne.";
        }else{
            echo "Le motif n'est pas présent dans la chaîne.";
        }
        ?>

Affichage :

Le motif est présent dans la chaîne.

Dans cet exemple, le motif ‘(Bonjour|Salut)’ signifie soit ‘Bonjour’ soit ‘Salut’.

Les quantificateurs non gourmands

Les quantificateurs sont gourmands par défaut, ce qui signifie qu’ils essaieront de correspondre au maximum de caractères possible. Pour les rendre non gourmands, vous pouvez les suivre de ‘?’ :

  • *? : Correspond au minimum d’occurrences du caractère précédent.
  • +? : Correspond au minimum d’occurrences du caractère précédent.
  • ?? : Correspond au minimum d’occurrences du caractère précédent.
  • {n,m}? : Correspond au minimum d’occurrences du caractère précédent.
<?php
        $chaine = "aaaaa";
        $motif = '/a{2,4}?/'; // correspond au minimum d'occurrences
        if(preg_match($motif, $chaine, $matches)){
            echo "Le motif est présent dans la chaîne : " . $matches[0];
        }else{
            echo "Le motif n'est pas présent dans la chaîne.";
        }
        ?>

Affichage :

Le motif est présent dans la chaîne : aa

Dans cet exemple, le motif ‘/a{2,4}?/’ correspond au minimum d’occurrences de ‘a’ dans la chaîne.

Les assertions

Les assertions sont des conditions qui doivent être remplies pour qu’un motif soit trouvé :

  • (?=…) : Recherche en avant (positive lookahead).
  • (?!…) : Recherche en avant négative (negative lookahead).
  • (?<=…) : Recherche en arrière (positive lookbehind).
  • (?<!…) : Recherche en arrière négative (negative lookbehind).
<?php
        $chaine = "ABC123";
        $motif = '/\d+(?=[A-Z])/'; // chiffres suivis de lettres majuscules
        if(preg_match($motif, $chaine, $matches)){
            echo "Le motif est présent dans la chaîne : " . $matches[0];
        }else{
            echo "Le motif n'est pas présent dans la chaîne.";
        }
        ?>

Affichage :

Le motif est présent dans la chaîne : 123

Dans cet exemple, le motif ‘\d+(?=[A-Z])’ correspond à des chiffres suivis de lettres majuscules.

Les options

Les options modifient le comportement des expressions régulières :

  • i : Insensible à la casse (ignore la distinction entre majuscules et minuscules).
  • m : Multiligne (traite les lignes multiples).
  • u : UTF-8 (traite les caractères UTF-8).
  • s : Traite le texte comme un seul bloc (fait en sorte que le point corresponde aux sauts de ligne).
<?php
        $chaine = "Hello\nWorld";
        $motif = '/world/i'; // insensible à la casse
        if(preg_match($motif, $chaine, $matches)){
            echo "Le motif est présent dans la chaîne : " . $matches[0];
        }else{
            echo "Le motif n'est pas présent dans la chaîne.";
        }
        ?>

Affichage :

Le motif est présent dans la chaîne : World

Dans cet exemple, l’option ‘i’ rend la recherche insensible à la casse, ce qui signifie que "world" correspond à "World".

Conclusion

Les expressions régulières sont un outil puissant pour la recherche de motifs dans les chaînes de caractères. Elles permettent de définir des motifs complexes en utilisant des caractères spéciaux, des quantificateurs, des classes prédéfinies, des groupes, des alternatives, des quantificateurs non gourmands, des assertions et des options. En comprenant ces concepts de base, vous serez en mesure de créer des expressions régulières efficaces pour résoudre divers problèmes de traitement de texte.

N’oubliez pas que la pratique est essentielle pour maîtriser les expressions régulières. Plus vous les utiliserez, plus vous deviendrez compétent dans leur création et leur utilisation.

Si vous avez des questions ou avez besoin d’exemples supplémentaires, n’hésitez pas à demander.

Maxime GUINARD
Maxime GUINARD

Merci d'avoir lu cet article. Je suis un développeur web WordPress passionné, et j'ai créé ce contenu avec soin pour vous offrir des informations de qualité. Restez connectés pour plus de conseils et d'astuces !

Facebook
Twitter
LinkedIn

Un projet en tête ?