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ètre | Description |
|---|---|
$pattern | Le motif, incluant les délimiteurs et les modificateurs optionnels, p. ex. '/colou?r/i'. |
$subject | La chaîne dans laquelle effectuer la recherche. |
&$matches | Rempli par référence : $matches[0] contient la correspondance complète, $matches[1], $matches[2]… contiennent les groupes capturants. |
$flags | Indicateurs binaires tels que PREG_OFFSET_CAPTURE et PREG_UNMATCHED_AS_NULL. |
$offset | Dé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
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']; // 21Capturer 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 où 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]; // 6Motifs 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
- Toutes les occurrences, pas seulement la première →
preg_match_all(). - Chercher et remplacer →
preg_replace(). - Diviser une chaîne sur un motif →
preg_split(); pour un délimiteur fixe, le simpleexplode()est plus rapide. - Échapper les entrées utilisateur avant de les intégrer dans un motif →
preg_quote(). - Un rappel sur la syntaxe PCRE → le chapitre sur les expressions régulières PHP.
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.