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?x17251" 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);

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)


siddhy

Développeur web full stack depuis une 15aine d'année 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

Da Scritch · 24 octobre 2019 à 10 h 19 min

« Comment valider une adresse email avec une REGEX »

NON SURTOUT PAS ! Il est mathématiquement impossible d’écrire une regex pour valider un e-mail.

Utilisez plutôt filter_var() qui est bien plus rapide et occasionnera beaucoup moins d’erreurs

    bazooka07 · 24 octobre 2019 à 14 h 14 min

    Exactement. Et je dirai la même chose pour les Urls, adresses IP., …
    Lire le manuel : https://www.php.net/manual/fr/filter.filters.validate.php

    Et pour tester les expressions régulières, je recommande https://regex101.com/

    siddhy · 24 octobre 2019 à 16 h 05 min

    C’était en fait plus pour mettre des exemples d’utilisation des REGEX. Il me semblait avoir mis un mot sur filter_vars() justement pour les @mails (apparemment pas… pas encore 😉 )
    Merci du commentaire DaScritch et bazooka07 🙂

Darwin · 24 octobre 2019 à 12 h 09 min

Et pour mettre en application tout cela : https://alf.nu/RegexGolf (notez que ça ne se limite pas qu’à PHP)

Laisser un commentaire

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