Expressions régulières en PHP : de la théorie à la pratique
\n\nLes expressions régulières (regex ou regexp) sont un outil puissant pour rechercher, remplacer et valider des chaînes selon un motif donné. En PHP, elles sont implémentées via un ensemble de fonctions PCRE (Perl Compatible Regular Expressions) et permettent de résoudre des tâches de toute complexité : de la validation d'email au parsing de code HTML. Dans cet article, nous analyserons la syntaxe, les fonctions principales et examinerons des exemples pratiques qui seront utiles à chaque développeur PHP.
\n\n1. Bases de la syntaxe des expressions régulières en PHP
\n\nToute expression régulière en PHP est encadrée par des délimiteurs (généralement des slashes /). Après le délimiteur de fermeture, on peut spécifier des modificateurs — des drapeaux qui modifient le comportement de la recherche.
$pattern = '/motif/modificateurs';\n\nMétacaractères principaux :
\n- \n
.— n'importe quel caractère unique (sauf saut de ligne) \n *— zéro ou plusieurs répétitions du caractère précédent \n +— une ou plusieurs répétitions \n ?— zéro ou une répétition (rend le quantificateur paresseux) \n ^— début de chaîne \n $— fin de chaîne \n \\d— chiffre (0-9) \n \\w— lettre, chiffre ou tiret bas \n \\s— caractère d'espacement \n []— classe de caractères (par exemple,[a-z]) \n ()— groupe de capture \n
Modificateurs courants :
\n- \n
i— recherche insensible à la casse \n m— mode multiligne (^ et $ fonctionnent pour chaque ligne) \n u— support UTF-8 (obligatoire pour le cyrillique) \n s— le point capture également le saut de ligne \n
2. Fonction preg_match() : recherche de correspondances
\n\npreg_match() est la fonction la plus courante. Elle vérifie si une chaîne correspond à un motif et retourne 1 (correspondance trouvée) ou 0 (aucune). Le troisième paramètre est un tableau dans lequel sont enregistrées les correspondances trouvées.
Exemple 1. Validation d'une adresse email
\n<?php\n$email = "user@example.com";\n$pattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/';\n\nif (preg_match($pattern, $email)) {\n echo "Email valide";\n} else {\n echo "Email invalide";\n}\n// Affichage : Email valide\n?>\n\nExemple 2. Extraction de données d'une chaîne
\n<?php\n$text = "Mon numéro : +7 (999) 123-45-67";\n$pattern = '/\\+7\\s*\\(\\d{3}\\)\\s*\\d{3}-\\d{2}-\\d{2}/u';\n\nif (preg_match($pattern, $text, $matches)) {\n echo "Numéro trouvé : " . $matches[0];\n}\n// Affichage : Numéro trouvé : +7 (999) 123-45-67\n?>\n\nNotez que le modificateur u est obligatoire si la chaîne contient du cyrillique ou des caractères Unicode spéciaux.
3. Fonction preg_replace() : remplacement selon un motif
\n\npreg_replace() recherche dans une chaîne toutes les correspondances avec un motif et les remplace par le texte spécifié. On peut utiliser les groupes de capture $1, $2, etc. pour insérer des parties du texte original.
Exemple 3. Formatage d'un numéro de téléphone
\n<?php\n$phone = "89991234567";\n$pattern = '/(\\d{1})(\\d{3})(\\d{3})(\\d{2})(\\d{2})/';\n$replacement = '+7 ($2) $3-$4-$5';\n\n$formatted = preg_replace($pattern, $replacement, $phone);\necho $formatted; // +7 (999) 123-45-67\n?>\n\nExemple 4. Nettoyage du HTML des balises (sauf celles autorisées)
\n<?php\n$html = "<b>Gras</b> <script>alert('xss')</script> texte";\n$pattern = '/<\\s*\\/?\\s*(?!b|i|u|a\\b)[^>]*>/ui';\n\n$clean = preg_replace($pattern, '', $html);\necho $clean; // <b>Gras</b> texte\n?><