preg_replace($pattern, $replacement, $subject) trouve chaque correspondance d'une expression régulière dans une chaîne et la remplace. preg_replace('/\s+/', ' ', $text) transforme chaque suite d'espaces, de tabulations et de sauts de ligne en un seul espace.
La chaîne d'origine n'est pas modifiée ; preg_replace() en renvoie une nouvelle. \b marque une limite de mot, c'est pourquoi cats reste intact.
Références arrière : {1} et \1
Dans le remplacement, $1 représente ce qu'a trouvé le premier groupe de capture, $2 le second, et $0 la correspondance complète. Utilisez-les pour réarranger le texte trouvé.
Écrivez le remplacement entre guillemets simples. Entre guillemets doubles, "\1" devient un échappement octal (l'octet 0x01) et "${1}" est lu comme une variable nommée 1, non définie et utilisant une syntaxe de chaîne dépréciée depuis PHP 8.2. '\1' entre guillemets simples fonctionne comme '$1', mais $1 est l'écriture courante.
Supprimer les caractères non alphanumériques
Une classe de caractères inversée, [^...], correspond à tout ce qui n'est pas listé. La remplacer par '' la supprime. Pour du texte dans d'autres langues, utilisez les classes Unicode \p{L} (n'importe quelle lettre) et \p{N} (n'importe quel chiffre) avec le modificateur u, sinon vous retirerez é, ü et tous les caractères japonais.
Créer un slug d'URL
Plusieurs motifs à la suite transforment un titre en slug d'URL. Passez d'abord en minuscules, remplacez chaque suite de caractères non alphanumériques par un seul tiret, puis retirez les tirets aux extrémités :
Plusieurs motifs, une limite et un compteur
$pattern et $replacement peuvent être des tableaux : chaque motif est remplacé par le remplacement de même index, dans l'ordre. Le quatrième argument limite les remplacements par motif (-1 signifie sans limite), et le cinquième reçoit le nombre de remplacements effectués.
Calculer le remplacement avec preg_replace_callback
Quand le remplacement dépend de la correspondance, utilisez preg_replace_callback(). Elle appelle votre fonction une fois par correspondance avec le tableau $matches et insère ce que la fonction renvoie. Une fonction fléchée garde les callbacks courts sur une seule ligne.
preg_replace_callback_array() prend un tableau de paires pattern => callback quand plusieurs motifs ont chacun besoin de leur propre fonction.
Un texte de remplacement venant d'une variable
Un $ ou une barre oblique inverse dans le remplacement a un sens, donc un remplacement venant d'un utilisateur ou d'une base de données peut être déformé. Un prix de $10 est lu comme une référence au groupe 10, qui n'existe pas, et ressort vide :
Quand ni le texte cherché ni le remplacement ne sont des motifs, str_replace() est le choix le plus simple et le plus rapide. Pour tester un motif avant de remplacer quoi que ce soit, voir preg_match().
Questions fréquentes
Comment utiliser des références arrière dans preg_replace ?
Désignez les groupes de capture par $1, $2 (ou \1) dans le remplacement : preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$3/$2/$1', '2026-03-14') renvoie "14/03/2026". Écrivez le remplacement entre guillemets simples, et utilisez ${1} quand un chiffre suit la référence.
Comment supprimer tous les caractères non alphanumériques en PHP ?
preg_replace('/[^a-zA-Z0-9]/', '', $s) ne garde que les lettres et chiffres ASCII. Pour garder les lettres de toutes les langues (é, ü, 日本語), utilisez des classes Unicode avec le modificateur u : preg_replace('/[^\p{L}\p{N}]/u', '', $s).
Quelle est la différence entre preg_replace et preg_replace_callback ?
preg_replace() prend une chaîne de remplacement fixe avec des marqueurs $1. preg_replace_callback() appelle une fonction pour chaque correspondance et utilise sa valeur de retour, vous pouvez donc calculer le remplacement : le mettre en majuscules, faire un calcul dessus ou le chercher dans un tableau.
Faut-il utiliser str_replace ou preg_replace ?
Utilisez str_replace() quand vous remplacez un texte fixe : elle est plus rapide et ne demande aucun échappement. Utilisez preg_replace() quand le texte à remplacer suit un motif, comme une suite d'espaces quelconque, n'importe quel chiffre ou une limite de mot.
Comment ne remplacer que la première correspondance avec preg_replace ?
Passez une limite en quatrième argument : preg_replace('/\d+/', '#', 'a1 b2 c3', 1) renvoie "a# b2 c3". Le cinquième argument, passé par référence, reçoit le nombre de remplacements effectués.