PHP : Valider une adresse e-mail / une URL / une IP (v4/v6)

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

Laisser un commentaire

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