W3docs

Expressions régulières PHP

Découvrez les expressions régulières en PHP : syntaxe des patterns, fonctions preg_, validation, extraction et remplacement de texte.

Une expression régulière (regex) est un motif qui décrit un ensemble de chaînes. Au lieu de rechercher un texte fixe, vous décrivez sa forme — « une adresse e-mail », « une suite de chiffres », « un mot se terminant par .php» — et PHP trouve, valide, remplace ou découpe le texte correspondant.

Ce chapitre explique comment fonctionnent les fonctions preg_ de PHP, la syntaxe d'un motif (délimiteurs, classes de caractères, quantificateurs, groupes, ancres) et les tâches pratiques les plus courantes : valider des entrées, extraire des données et remplacer du texte.

Que sont les expressions régulières

Une expression régulière est une suite de caractères qui définit un motif de recherche. La plupart des caractères se correspondent eux-mêmes — le motif cat correspond au texte littéral cat. La puissance vient des métacaractères qui représentent des catégories de caractères ou de la répétition :

JetonSignificationExemple de correspondance
.N'importe quel caractère unique (sauf saut de ligne)c.tcat, cut
\dUn chiffre 0-9\d\d42
\wUn caractère « mot » (a-z, A-Z, 0-9, _)\w+hello_1
\sEspace blanc (espace, tabulation, saut de ligne)
[abc]L'un des caractères a, b, c[aeiou]e
[^abc]N'importe quel caractère sauf a, b, c
a*Zéro ou plusieurs a"", aaa
a+Un ou plusieurs aa, aaa
a?Zéro ou un a (optionnel)"", a
a{2,4}Entre 2 et 4 occurrences de aaa, aaaa
^ / $Début / fin de la chaîne
|Alternance (« ou »)cat|dogcat ou dog
()Groupement / capture(ab)+abab

Comment fonctionnent les expressions régulières en PHP

PHP utilise PCRE (Perl-Compatible Regular Expressions) via la famille de fonctions preg_. Celles que vous utiliserez le plus souvent :

FonctionCe qu'elle fait
preg_match()Teste si un motif correspond ; capture la première correspondance
preg_match_all()Trouve toutes les correspondances dans une chaîne
preg_replace()Remplace chaque correspondance par un nouveau texte
preg_split()Découpe une chaîne selon un motif
preg_quote()Échappe les métacaractères regex dans une chaîne littérale

La syntaxe d'un motif PHP

Un motif PHP est une chaîne composée de trois parties : un délimiteur, le motif et des modificateurs optionnels.

/pattern/modifiers

Le premier caractère est le délimiteur — presque toujours /, mais n'importe quel caractère non alphanumérique fonctionne (#, ~, !). Choisir un délimiteur qui n'apparaît pas dans votre motif vous évite de l'échapper. Par exemple, faire correspondre un chemin d'URL est plus lisible avec # :

"#^/users/\d+$#"   // no need to escape the slashes

Les modifiers sont des lettres optionnelles après le délimiteur fermant qui modifient le comportement du moteur :

  • i — insensible à la casse (insensitive) : /php/i correspond à PHP, Php, php.
  • mmultilignes : ^ et $ correspondent au début/à la fin de chaque ligne, et pas seulement de la chaîne entière.
  • s — ligne unique (single line, « dotall ») : . correspond aussi aux sauts de ligne.
  • u — traite le motif et le sujet comme de l'UTF-8. À utiliser pour tout texte contenant des caractères non-ASCII.
  • x — étendu : les espaces dans le motif sont ignorés, vous pouvez donc espacer et commenter les motifs complexes.

Tester une correspondance avec preg_match

preg_match() retourne 1 si le motif est trouvé, 0 sinon, et false en cas d'erreur. C'est le bon choix pour une question oui/non comme « cette chaîne contient-elle un chiffre ? »

php— editable, runs on the server

Le troisième argument optionnel, $matches, est rempli avec les résultats : $matches[0] est la correspondance complète, et $matches[1], $matches[2], … sont les groupes de capture dans l'ordre — les sous-chaînes capturées par chaque paire de parenthèses.

Valider les entrées utilisateur

Une utilisation courante des regex est la validation des entrées utilisateur — vérifier qu'une valeur a la bonne forme avant de la stocker ou de lui faire confiance. Voici une vérification basique d'e-mail :

<?php

$email = "[email protected]";

if (preg_match("/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/", $email)) {
    echo "Valid email address";
} else {
    echo "Invalid email address";
}

?>

Les ancres ^ et $ sont importantes ici : sans elles, le motif correspondrait à un e-mail n'importe où dans une chaîne plus grande, donc "junk [email protected] junk" passerait la validation. Avec elles, la chaîne entière doit être un seul e-mail.

Pour les e-mails spécifiquement, le filter_var() intégré de PHP avec FILTER_VALIDATE_EMAIL est plus robuste qu'une regex écrite manuellement. Utilisez les regex quand vous avez besoin d'un format que les filtres ne couvrent pas — codes postaux, identifiants personnalisés, formats de téléphone. Voir la validation de formulaires PHP pour un exemple complet de vérification des entrées.

Trouver toutes les correspondances avec preg_match_all

Là où preg_match() s'arrête à la première occurrence, preg_match_all() les collecte toutes — utile pour extraire tous les hashtags, prix ou liens d'un bloc de texte.

<?php

$text = "Prices: $12, $7 and $349";

preg_match_all("/\\\$(\d+)/", $text, $matches);

print_r($matches[1]); // the captured numbers

?>

$matches[1] contient un tableau de tous les groupes capturés — ici, ["12", "7", "349"].

Remplacer du texte avec preg_replace

preg_replace() substitue chaque correspondance. Dans la chaîne de remplacement, $1, $2, … font référence aux groupes capturés, ce qui vous permet de réécrire et pas seulement de supprimer :

<?php

$date = "2026-06-21";

// Reformat YYYY-MM-DD into DD/MM/YYYY
echo preg_replace("/(\d{4})-(\d{2})-(\d{2})/", "$3/$2/$1", $date);
// 21/06/2026

?>

Pour découper une chaîne en morceaux selon un motif plutôt que de remplacer, utilisez preg_split() — par exemple pour découper sur n'importe quelle suite d'espaces avec /\s+/.

Techniques avancées

Une fois à l'aise avec les bases, ces fonctionnalités permettent de gérer des motifs plus complexes :

  • Groupes de capture (...) — extraire des parties spécifiques d'une correspondance, comme montré ci-dessus avec $matches[1].
  • Groupes non-capturants (?:...) — grouper sans remplir un emplacement dans $matches, quand vous n'avez besoin du groupement que pour un quantificateur ou une alternance.
  • Groupes nommés (?<year>\d{4}) — référencer une correspondance par son nom ($matches['year']) plutôt que par son numéro.
  • Lookahead (?=...) et lookbehind (?<=...) — faire correspondre selon ce qui vient après ou avant, sans le consommer. Utile pour « un nombre suivi de px » sans capturer px.
  • Quantificateurs paresseux *?, +? — correspondent au minimum de caractères possible. Par défaut, .* est gourmand et attrape tout ce qu'il peut.

Une note sur l'échappement : des caractères comme ., +, *, ?, (, ), [, \ ont une signification spéciale. Pour les faire correspondre littéralement, préfixez-les d'un antislash (\. correspond à un point littéral). Quand le texte littéral vient d'une variable, utilisez preg_quote() pour l'échapper en toute sécurité.

Erreurs fréquentes

  • Oublier les délimiteurs. Les motifs PHP sont des chaînes et doivent inclure des délimiteurs : "/\d+/", pas "\d+". Les omettre déclenche un avertissement et la correspondance échoue.
  • Double-échappement dans les chaînes entre guillemets doubles. Dans "...", un antislash est aussi un caractère d'échappement PHP. "/\d/" fonctionne parce que \d n'est pas un caractère d'échappement PHP, mais pour faire correspondre un $ littéral, il faut "/\\$/". Les chaînes entre guillemets simples ('/\d/') évitent cette surprise.
  • La correspondance gourmande capture trop. <.*> sur <a><b> correspond à l'ensemble <a><b>, et non à <a> seul. Utilisez un <.*?> paresseux ou une classe niée <[^>]*>.
  • Oublier le modificateur u pour UTF-8. Sans /u, . et \w opèrent sur les octets, ce qui corrompt les caractères multi-octets.

Conclusion

Les expressions régulières vous permettent de décrire la forme du texte plutôt que son contenu exact, ce qui les rend indispensables pour valider les entrées, extraire des données et transformer des chaînes. En PHP, vous les utilisez via les fonctions preg_ : preg_match() et preg_match_all() pour rechercher, preg_replace() pour réécrire, et preg_split() pour découper les chaînes. Commencez par les ancres, les classes de caractères et les quantificateurs, puis ajoutez les groupes et les assertions de position à mesure que vos motifs se complexifient. Pour approfondir les chaînes que vous ferez correspondre, voir PHP Strings.

Pratique

Pratique
Quel est le principal objectif des regex PHP ?
Quel est le principal objectif des regex PHP ?
Was this page helpful?