Comment valider une adresse mail, une URL ou une IP v4 ou v6 en PHP ?
On trouve, sur internet, une multitude d’expressions régulières plus ou moins heureuses destinées à tester la syntaxe d’une adresse de courriel, d’une URL ou d’une IP en PHP.
Pourtant, ces tests sont déjà couverts par le langages au travers de la fonction « filter_var » (http://php.net/manual/en/function.filter-var.php) qui, comme son nom l’indique, applique « un filtre » à une variable :
filter_var(chaîne_à_tester, FILTER_VALIDATE_EMAIL) filter_var(chaîne_à_tester, FILTER_VALIDATE_IP[, options]) filter_var(chaîne_à_tester, FILTER_VALIDATE_URL[, options]) |
La fonction retourne la chaîne de caractère à tester en cas de succès, rien sinon.
Tests disponibles
La liste des filtres applicables (http://php.net/manual/en/filter.filters.validate.php) comprend entre autre :
- FILTER_VALIDATE_EMAIL : qui retourne la chaîne de caractères passée au filtre si elle représente une adresse mail valide, rien sinon
- FILTER_VALIDATE_IP : qui retourne la chaîne de caractères passée en argument si elle représente une IP valide, rien sinon et qui peut être complété par les filtre :
- FILTER_FLAG_IPV4 pour matcher une IP v4 uniquement
- FILTER_FLAG_IPV6 pour valider une IP v6 uniquement
- FILTER_FLAG_NO_PRIV_RANGE pour exclure les IPs de plages privées (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, FD ou FC)
- FILTER_FLAG_NO_RES_RANGE pour exclure les IPs réservées (0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24 ou 224.0.0.0/4)
- FILTER_VALIDATE_URL : qui retourne la chaîne de caractère passée en argument si elle représente une URL valide et rien sinon. Peut être complété par :
- FILTER_FLAG_PATH_REQUIRED pour exiger que l’url contienne un chemin arborescent (exemple : https://www.admin-linux.fr/mon/chemin)
- FILTER_FLAG_QUERY_REQUIRED pour exiger que l’URL contienne une requête (exemple : https://www.admin-linux.fr/?p=8382)
Exemples
Validation d’adresse mail
La syntaxe du filtrage d’adresses mail est de la forme :
filter_var(chaîne_à_tester, FILTER_VALIDATE_EMAIL) |
Ce qui donne dans le code :
<?php $mail='fhh@amin-linux.fr' ; echo "* $mail\t > Adresse ".((strlen(filter_var($mail, FILTER_VALIDATE_EMAIL))) ? "valide" : "invalide")."\n" ; $mail='fhh@amin-linux' ; echo "* $mail\t > Adresse ".((strlen(filter_var($mail, FILTER_VALIDATE_EMAIL))) ? "valide" : "invalide")."\n" ; ?> |
et à l’exécution :
* fhh@amin-linux.fr > Adresse valide * fhh@amin-linux > Adresse invalide |
Note : Nous utilisons dans cet exemple l’opérateur ternaire appliqué à la longueur de la chaîne de caractères retournée par la fonction « filter_var » pour afficher « valide » ou « invalide ». Si la chaîne « $mail » est une adresse valide, la longueur de la chaîne retournée est non nulle (> 0) donc vaut « vrai » d’où l’affichage de « valide », sinon, la chaîne est vide (longueur nulle = 0) donc vaut faux d’où l’affichage « d’invalide ».
Validation d’URLs
La syntaxe du filtrage d’URL est du type :
filter_var(chaîne_à_tester, FILTER_VALIDATE_URL[, FILTER_FLAG_PATH_REQUIRED | FILTER_FLAG_QUERY_REQUIRED]) |
Ce qui peux donner un code du genre :
<?php $url='https://www.admin-linux.fr/?p=3' ; echo "1 ".filter_var($url, FILTER_VALIDATE_URL)."\n" ; $url='https://www.admin-linux.fr/somewhere/' ; // URL valide avec path echo "2 ".filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED)."\n" ; $url='https://www.admin-linux.fr/somewhere/?var=x&var2=y' ; // URL valide avec path echo "3 ".filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED)."\n" ; $url='https://www.admin-linux.fr/avec/path/page.php?var=x' ; echo "4 ".filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED|FILTER_FLAG_QUERY_REQUIRED)."\n" ; $url='https://www.admin-linux.fr?var=x' ; echo "5 ".filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED|FILTER_FLAG_QUERY_REQUIRED)."\n" ; ?> |
qui donne à l’exécution :
1 https://www.admin-linux.fr/?p=3 2 https://www.admin-linux.fr/somewhere/ 3 https://www.admin-linux.fr/somewhere/?var=x&var2=y 4 https://www.admin-linux.fr/avec/path/page.php?var=x 5 |
Note : FILTER_FLAG_PATH_REQUIRED se base sur le premier slash après le domaine, ainsi « https://www.admin-linux.fr/ » et plus généralement « https://www.admin-linux.fr/* » valide ce filtre.
Validation d’IPs
Syntaxe de quelques tests sur une IPV6 :
<?php $ip="fe80::217:8fa:fe42:2436" ; echo "1 Test valide ? ".filter_var($ip, FILTER_VALIDATE_IP)."\n" ; echo "2 Test ipv4 ? ".filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV4)."\n" ; echo "3 Test ipv6 ? ".filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV6)."\n" ; echo "4 Test ip privée ? ".filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_NO_PRIV_RANGE)."\n" ; echo "5 Test ip réservée ? ".filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_NO_RES_RANGE)."\n" ; ?> |
qui donne à l’exécution :
1 Test valide ? fe80::217:8fa:fe42:2436 2 Test ipv4 ? 3 Test ipv6 ? fe80::217:8fa:fe42:2436 4 Test ip privée ? fe80::217:8fa:fe42:2436 5 Test ip réservée ? |
et pour $ip= »127.0.0.1″ :
1 Test valide ? 127.0.0.1 2 Test ipv4 ? 127.0.0.1 3 Test ipv6 ? 4 Test ip privée ? 127.0.0.1 5 Test ip réservée ? |
Références
Filtres supportés (Validate filters) : http://php.net/manual/en/filter.filters.validate.php
Tous les filtres : http://php.net/manual/en/filter.filters.php
Fonction « filter_var » : http://php.net/manual/en/function.filter-var.php