Dans cet article nous allons voir comment fonctionnent les expressions régulières en PHP, ainsi que comment les utiliser pour effectuer une comparaison de motifs de manière efficace.

Les expressions régulières sont un outil très utile pour les développeurs. Ils permettent de trouver, d’identifier ou de remplacer un mot, un caractère ou tout autre type de chaîne. Ce tutoriel vous apprendra à maîtriser le regexp PHP et vous montrera des expressions régulières PHP utiles prêtes à l’emploi ou d’autres utilisées à titre d’exemple pour bien appréhender ces expressions.

Commençons par un bref aperçu des fonctions de filtrage intégrées de PHP les plus couramment utilisées avant de plonger dans le monde des expressions régulières.

Les fonctions REGEX en PHP

FonctionDescription
preg_match()recherche un motif dans la chaîne de caractères, retourne true si le motif existe, et false sinon.
preg_match_all()Effectue une recherche globale sur toutes les occurrences du motif dans la chaîne. Utile pour la recherche et le remplacement.
preg_replace()Effectue une recherche et un remplacement d’expressions régulières.
preg_grep()recherche tous les éléments du tableau d’entrée, retournant tous les éléments correspondant au motif regex dans une chaîne.
preg_split()Divise une chaîne de caractères en chaînes de caractères en utilisant une expression régulière.
preg_quote()Cite les caractères d’expression régulière trouvés dans une chaîne.

Note : La fonction PHP preg_match() arrête la recherche après avoir trouvé la première correspondance, alors que la fonction preg_match_all() continue la recherche jusqu’à la fin de la chaîne et trouve toutes les correspondances possibles au lieu de s’arrêter au premier résultat.

Pour plus d’informations sur les fonctions natives des expressions régulières PHP, consultez le manuel.

Les délimitateurs de pattern REGEX en php

La première et la plus importante chose à savoir sur les fonctions preg est qu’ils s’attendent à ce que vous encadriez les motifs de regex avec un caractère délimiteur de chaque côté. Par exemple, si vous choisissez “~” comme délimiteur, pour le motif regex \b\w\w+\b, vous devrez donner la chîne ~\b\w+\b~ à la fonction preg.

Pour le délimiteur, vous pouvez choisir n’importe quel caractère à l’exception des espaces et des barres obliques inverses. Mais choisissez judicieusement, car si votre délimiteur apparaît dans le motif, il doit être échappé. La barre oblique avant est un délimiteur populaire, et bizarrement, puisqu’elle doit être échappée dans toutes sortes de chaînes de caractères en rapport avec les chemins de fichiers. Par exemple, pour faire correspondre http://, voulez-vous vraiment que votre chaîne regex ressemble à /http:\/\/\/// ?

Est-ce que ~http://~ n’est pas plus lisible ?

Les caractères rares tels que “~”, “%”, “#” ou “@” sont des choix plus raisonnables et assez populaires.

Syntaxe des expressions régulières REGEX en php

La syntaxe des expressions régulières inclut l’utilisation de caractères spéciaux. Les caractères auxquels on donne une signification spéciale dans une expression régulière, sont : . * ? + [ ] ( ) { } ^ $ |. Vous devrez échapper ces caractères chaque fois que vous voudrez les utiliser littéralement. Par exemple, si vous voulez faire correspondre “.”, vous devrez écrire \. Tous les autres caractères prennent automatiquement leur sens littéral.

Le tableau suivant décrit les regex les plus courants :

.Correspond à n’importe quel caractère simple sauf le caractère de nouvelle ligne \n
fooCorrespond à la chaîne “foo”
^fooCorrespond à la chaîne “foo” en début de chaîne
foo$Correspond à la chaîne “foo” en fin de chaîne
^foo$Correspond exactement à la chaîne “foo”
[abc]Correspond à l’un des caractères a, b ou c.
[^abc]Correspond à un caractère autre que a, b ou c.
[a-z]Correspond à n’importe quel caractère, de a minuscule à z minuscule.
[^A-Z]Correspond à n’importe quel caractère autre qu’une majuscule
[a-z]+Correspond à un ou plus caractères minuscules
[0-9.-]Correspond à n’importe quel nombre, point ou tiret
\dCorrespond à n’importe quel chiffre décimal. Équivalent à [0-9].
\DCorrespond à n’importe quel caractère non numérique. Équivalent à [^0-9]
\sCorrespond à n’importe quel caractère d’espacement (espace, tabulation, nouvelle ligne ou caractère de retour chariot). Similaire à [\t\n\r]
\SCorrespond à n’importe quel caractère qui n’est pas un caractère d’espacement
\wCorrespond à n’importe quel caractère de mot (défini de a à z, de A à Z, de 0 à 9, et le trait de soulignement). Identique à [a-zA-Z_0-9]
\WCorrespond à n’importe quel caractère qui n’est pas un mot. Identique à [^a-zA-Z_0-9]
(gif|jpg)Correspond à “gif” ou “jpg”
^[a-zA-Z0-9_]{1,}$Correspond à un mot d’au moins une lettre, un chiffre ou “_”
([wx])([yz])Correspond à “wy”, “wz”, “xy” ou “xz”
[^A-Za-z0-9]Correspond à un symbole (ni une lettre, ni un nombre)
([A-Z]{3}|[0-9]{4})Correspond à 3 lettres ou 4 nombres

Exemples concrets d’utilisation de REGEX en PHP

Comment valider un nom de domaine en PHP avec les REGEX

Chaque domaine de site Web contient le protocole initial (HTTP ou HTTPS) et souvent un sous-domaine plus le chemin de page supplémentaire. Vous pouvez utiliser ce snippet pour valider un nom de domaine.

$url = "https://www.zenndevs.xyz/";
if (preg_match('/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?\/?/i', $url)) {
    echo "Your url is ok.";
} else {
    echo "Wrong url.";
}

Comme pour la validation des adresses emails, la fonction PHP filter_var()est aussi très pratique pour valider les noms de domaine. Merci bazooka07 pour le commentaire

Source : SNIPPLR

Comment valider une adresse email avec une REGEX

L’une des tâches les plus courantes pour un développeur est de vérifier si une chaîne est formatée dans le style d’une adresse e-mail. Il existe de nombreuses variantes différentes pour accomplir cette tâche, en voici une.

$email = "contact@exemple.com";
if (preg_match('/[-0-9a-zA-Z.+_]+@[-0-9a-zA-Z.+_]+.[a-zA-Z]{2,4}/igm', $email)) {
    echo "Your email is ok.";
} else {
    echo "Wrong email.";
}

Comme le mentionne Da Scritch dans les commentaires, la validation des adresses emails en REGEX n’est pas une sinécure et il vaut mieux pour cela utiliser la fonction PHP filter_var() bien plus simple et pour un meilleur résultat !

Comment valider une date française avec les REGEX

Les dates sont délicates parce qu’elles peuvent apparaître sous différentes formes. PHP a des fonctions et méthodes de date plutôt complètes mais vous pouvez avoir besoin d’un petit snippet permettant une validation rapide d’un format de date particulier. Si vous êtes en javascript allez voir mon petit article sur le librairie de gestion de date avec moment.js


$dateFr = "14/10/2019";
if (preg_match('/^(((0[1-9])|(1\d)|(2\d)|(3[0-1]))\/((0[1-9])|(1[0-2]))\/(\d{4}))$/gm', $dateFr)) {
    echo "Your date is ok.";
} else {
    echo "Wrong date.";
}

Comment valider un numéro de téléphone en REGEX

Court et direct. Cette regex validera toute syntaxe de numéro de téléphone traditionnelle basée principalement sur le style français des numéros de téléphone.

Comme cela peut se transformer en un sujet assez compliqué, je vous recommande de parcourir ce fil de discussion Stack pour obtenir des réponses plus détaillées.

$tel = '+33100000000';

if (preg_match('/((\+)33|0|0033)[1-9](\d{2}){4}/igm', $tel)) {
    echo "Your tel is ok.";
} else {
    echo "Wrong tel.";
}

Comment récupérer l’identifiant youtube d’un lien

YouTube a gardé la même structure d’URL pendant des années parce qu’elle fonctionne tout simplement. C’est aussi le site de partage de vidéos le plus populaire sur le Web, donc les vidéos YouTube ont tendance à générer le plus de trafic.

Si vous avez besoin de sortir un identifiant vidéo YouTube d’une URL, ce code regex est parfait et devrait fonctionner parfaitement pour toutes les variantes des structures URL YouTube.

$youtube_url = 'https://youtu.be/tdZtQsu821M';

if (preg_match('/https:\/\/(?:youtu\.be\/|(?:[a-z]{2,3}\.)?youtube\.com\/watch(?:\?|#\!)v=)([\w-]{11}).*/ig', $youtube_url, $matches)) {
    echo "Your youtube id is : " . $matches[1];
} else {
    echo "Wrong youtube url.";
}

Comment surligner un mot dans une phrase en REGEX

Cette expression régulière très utile trouvera un mot spécifique dans une chaîne de caractères et le surlignera. Extrêmement utile pour les résultats de recherche. Rappelez-vous qu’il est sensible à la casse.

//Highlight a word in the content
$text = "Sample sentence from KomunitasWeb, regex has become popular in web programming. Now we learn regex. According to wikipedia, Regular expressions (abbreviated as regex or regexp, with plural forms regexes, regexps, or regexen) are written in a formal language that can be interpreted by a regular expression processor";
$text = preg_replace("/\b(regex)\b/i", '<span style="background:#5fc9f6">\1</span>', $text);
echo $text;

Source : SNIPPLR

Comment récupérer la source (src) d’une balise image en REGEX

Si, pour une raison quelconque, vous devez extraire la source d’une image directement à partir de HTML, cet extrait de code est la solution parfaite.

$img_html = '<p>Mon image <img src="https://www.zendevs.xyz/upload/2019/09/mon-image.jpg?x16166" alt="mon image" /> </p>';

if (preg_match('/\< *[img][^\>]*[src] *= *[\"\']{0,1}([^\"\'\ >]*)/gmi', $img_html, $matches)) {
    echo "Votre image : " . $matches[1];
} else {
    echo "Aucune image";
}

Si vous préférez plutôt obtenir toutes les images d’une page web, ce bout de code pourrait vous aider

$images = [];
preg_match_all('/(img|src)=("|')[^"'>]+/i', $data, $media);
unset($data);
$data=preg_replace('/(img|src)("|'|="|=')(.*)/i',"$3",$media[0]);
foreach($data as $url)
{
	$info = pathinfo($url);
	if (isset($info['extension']))
	{
		if (($info['extension'] == 'jpg') ||
		($info['extension'] == 'jpeg') ||
		($info['extension'] == 'gif') ||
		($info['extension'] == 'png'))
		array_push($images, $url);
	}
}
print_r($images);

Source : Dave Brooks

Comment récupérer le Meta Title d’une page HTML avec les REGEX

Cet extrait de code pratique trouvera et affichera le texte contenu entre les balises <title> et </title> d’une page HTML.

$fp = fopen("https://www.zendevs.xyz/","r"); 
while (!feof($fp) ){
    $page .= fgets($fp, 4096);
}

$titre = eregi("<title>(.*)</title>",$page,$regs); 
echo $regs[1];
fclose($fp);

Comment valider un code postal français

Vous cherchez à vérifier qu’un code postal est bien au format français ? Ce petit bout de regex vous permet de contrôler qu’il est composé de 5 chiffres, avec éventuellement le préfixe « F- » pour les cas internationaux. Parfait pour éviter les fautes de frappe dans votre base d’adresses !


// Exemple de validation d'un code postal français
$postal = "75001";
if (preg_match('/^(F\-)?\d{5}$/', $postal)) {
    echo "Code postal valide !";
} else {
    echo "Code postal invalide.";
}

Comment extraire des adresses IP (IPv4)

Besoin de détecter toutes les adresses IP dans un texte (pour surveiller vos serveurs ou pour jouer au détective numérique) ? Utilisez cette regex pour extraire les adresses IPv4.


// Exemple pour extraire des adresses IP
$text = "Les serveurs 192.168.1.1 et 10.0.0.254 sont en ligne.";
preg_match_all('/\b(?:\d{1,3}\.){3}\d{1,3}\b/', $text, $ips);
print_r($ips[0]); // Affiche : Array ( [0] => 192.168.1.1 [1] => 10.0.0.254 )

Comment extraire les hashtags d’un tweet

Les réseaux sociaux n’ont jamais été aussi incontournables, et avec eux, les hashtags ! Voici une regex simple pour extraire tous les hashtags d’un tweet. Idéal pour analyser le buzz ou pour alimenter vos dashboards de données.


// Exemple pour extraire les hashtags d'un tweet
$tweet = "Apprenez le PHP avec #Zendevs et boostez votre #développement web !";
preg_match_all('/#\w+/', $tweet, $hashtags);
print_r($hashtags[0]); // Affiche : Array ( [0] => #Zendevs [1] => #développement )

Comment remplacer les sauts de ligne multiples par un seul saut de ligne

Un texte trop « espacé » à cause de multiples sauts de ligne peut nuire à la lisibilité. Cette regex remplace toutes les occurrences de sauts de ligne consécutifs par un seul, pour un rendu net et ordonné. Parfait pour nettoyer vos données textuelles !


// Exemple pour normaliser les sauts de ligne dans un texte
$text = "Ligne 1\n\n\nLigne 2\n\nLigne 3";
$result = preg_replace('/(\r?\n)+/', "\n", $text);
echo $result; // Affiche le texte avec un seul saut de ligne entre chaque ligne.

Conclusion

J’espère qu’avec tous ces exemples vous comprenez un peu mieux les expressions régulières et l’utilité qu’elles peuvent avoir dans vos développements. N’hésitez pas à m’envoyer vos snippets en commentaire 😉 (et/ou me dire si vous voyez des erreurs quelques part)

Catégories : Développement

siddhy

Développeur web full stack depuis 2004 dans une agence web du sud de la France et Geek depuis toujours, l'apprentissage et le partage font parti intégrante de ma philosophie au même titre que l'évolution personnelle et la sagesse bouddhiste.

4 commentaires

Johny · 07/03/2023 à 15:49

Bonjour merci pour l’article

    siddhy · 24/04/2023 à 11:53

    Avec plaisir (même si l’article date un peu 🙂 )

Emmanuel · 08/04/2024 à 15:44

et pour connaitre le nombre de « chose » :
5 x voitures
3 x tables
1 x chaise
Quel regex utiliser ?

merci !

    Rémy · 14/02/2025 à 08:50

    Emmanuel, ta question est un peu vague pour pouvoir t’aider. Je m’y serais bien attelé pour m’entrainer, mais je ne comprends pas l’énoncé 🙂 Quel besoin avais tu ? (oui je déterre les posts :D)

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site est protégé par reCAPTCHA et Google Politique de confidentialité et Conditions d'utilisation appliquer.

La période de vérification reCAPTCHA a expiré. Veuillez recharger la page.