W3docs

preg_match()

En PHP, preg_match() effectue une correspondance par expression régulière dans une chaîne et retourne 1 si le motif est trouvé, 0 sinon.

Introduction

preg_match() effectue une correspondance par expression régulière dans une chaîne. Elle indique si un motif PCRE est présent dans le sujet et, optionnellement, capture ce qu'il a trouvé. Elle s'arrête à la première correspondance — si vous avez besoin de toutes les occurrences, utilisez preg_match_all() à la place.

Ce chapitre couvre la signature et les valeurs de retour, comment le tableau $matches est rempli, les indicateurs les plus utiles, et les pièges (la confusion entre 0 et false, l'ancrage, les délimiteurs) qui font trébucher les développeurs.

Syntaxe

preg_match(
    string $pattern,
    string $subject,
    array &$matches = null,
    int $flags = 0,
    int $offset = 0
): int|false
ParamètreDescription
$patternLe motif, incluant les délimiteurs et les modificateurs optionnels, p. ex. '/colou?r/i'.
$subjectLa chaîne dans laquelle effectuer la recherche.
&$matchesRempli par référence : $matches[0] contient la correspondance complète, $matches[1], $matches[2]… contiennent les groupes capturants.
$flagsIndicateurs binaires tels que PREG_OFFSET_CAPTURE et PREG_UNMATCHED_AS_NULL.
$offsetDécalage en octets à partir duquel commencer la recherche.

Valeur de retour : 1 si le motif correspond, 0 s'il ne correspond pas, ou false en cas d'erreur (motif invalide). Puisque preg_match() retourne au maximum 1, elle n'indique jamais combien de correspondances existent — seulement qu'il y en a eu une.

Exemple de base

php— editable, runs on the server

Le motif capture un mot alphabétique suivi d'un espace blanc et d'un autre mot. En cas de correspondance, $matches[0] contient la correspondance complète (This is), et $matches[1] / $matches[2] contiennent les deux groupes capturés (This et is).

Le piège 0 vs false

Un bug très courant consiste à utiliser == pour tester le résultat. preg_match() retourne 0 pour « aucune correspondance » et false uniquement en cas d'erreur, et 0 == false vaut true en PHP. Comparez toujours avec l'opérateur strict :

<?php

$result = preg_match('/[0-9]+/', 'abc');

// Wrong: treats "no match" and "error" the same
if ($result == false) {
  echo "ambiguous\n";
}

// Right: distinguish the three outcomes
if ($result === false) {
  echo "Error in the pattern\n";
} elseif ($result === 0) {
  echo "No match\n";
} else {
  echo "Matched\n";
}

Ce code affiche ambiguous puis No match.

Groupes nommés

Ajoutez (?<name>...) à votre motif et $matches contiendra les captures à la fois sous l'index numérique et sous le nom, ce qui rend le code lisible même lorsque l'ordre des groupes change :

<?php

$date = '2026-06-21';
preg_match('/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/', $date, $m);

echo $m['year'] . "\n";  // 2026
echo $m['month'] . "\n"; // 06
echo $m['day'];          // 21

Capturer les décalages avec PREG_OFFSET_CAPTURE

Passez l'indicateur PREG_OFFSET_CAPTURE et chaque entrée dans $matches devient une paire [texte_correspondant, décalage_en_octets], ce qui vous permet de savoir la correspondance s'est produite :

<?php

preg_match('/world/', 'hello world', $m, PREG_OFFSET_CAPTURE);

echo $m[0][0] . "\n"; // world
echo $m[0][1];        // 6

Motifs insensibles à la casse et ancrés

Les modificateurs se placent après le délimiteur fermant. Le modificateur i ignore la casse ; ^ et $ ancrent la correspondance au début et à la fin de la chaîne, de sorte que le sujet entier doit correspondre au motif :

<?php

var_dump(preg_match('/^hello$/i', 'HELLO')); // int(1)
var_dump(preg_match('/^hello$/i', 'hello!')); // int(0)

Quand utiliser autre chose

Conclusion

preg_match() est la fonction de référence pour tester si une chaîne correspond à un motif et pour extraire les groupes capturés. Retenez ses trois valeurs de retour, comparez avec === pour éviter le piège 0/false, et passez à preg_match_all() quand une seule correspondance ne suffit pas.

Pratique

Pratique
Quel est le rôle de la fonction 'preg_match' en PHP ?
Quel est le rôle de la fonction 'preg_match' en PHP ?
Was this page helpful?