FILTER_VALIDATE_IP est un filtre PHP qui vérifie qu'une chaîne de caractères est une adresse IP syntaxiquement correcte — IPv4 ou IPv6. Combiné à des drapeaux (FILTER_FLAG_*), il permet en plus d'exiger une version précise ou d'exclure les adresses privées et réservées.
Étape 1 — Valider une IP sans restriction de version
Sans drapeau, le filtre accepte n'importe quelle adresse syntaxiquement valide, IPv4 comme IPv6. C'est le comportement à utiliser quand seul le format compte, par exemple pour un simple contrôle de saisie.
<?php
$ip = "192.168.0.1";
if (! filter_var($ip, FILTER_VALIDATE_IP))
{
echo "IP est inadmissible";
}
else
{
echo "IP est valide";
}
?>
Résultat attendu :
IP est valide
192.168.0.1 est une adresse IPv4 correctement formée. Aucun drapeau n'étant précisé, le filtre ne regarde pas si elle appartient à une plage privée — il vérifie uniquement le format.
Étape 2 — Exiger une adresse IPv4 avec FILTER_FLAG_IPV4
Le drapeau FILTER_FLAG_IPV4 restreint la validation au format IPv4 : une adresse IPv6 syntaxiquement valide serait rejetée si ce drapeau est présent.
<?php
$ip = "192.168.0.1";
if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
{
echo "IP est inadmissible";
}
else
{
echo "IP est valide";
}
?>
Résultat attendu :
IP est valide
192.168.0.1 respecte le format IPv4 attendu par le drapeau, donc la validation passe.
Étape 3 — Exiger une adresse IPv6 avec FILTER_FLAG_IPV6
De la même façon, FILTER_FLAG_IPV6 n'accepte que le format IPv6 — une adresse IPv4 serait rejetée.
<?php
$ip = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";
if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6))
{
echo "IP est inadmissible";
}
else
{
echo "IP est valide";
}
?>
Résultat attendu :
IP est valide
L'adresse fournie est un IPv6 correctement formé, elle passe la validation.
Étape 4 — Exclure les adresses privées avec FILTER_FLAG_NO_PRIV_RANGE
Certaines plages IP sont réservées aux réseaux locaux par l'IANA — 10.0.0.0/8, 172.16.0.0/12 et 192.168.0.0/16 en IPv4. FILTER_FLAG_NO_PRIV_RANGE rejette une adresse qui s'y trouve, même si son format est valide.
<?php
$ip = "192.168.0.1";
if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE))
{
echo "IP est inadmissible";
}
else
{
echo "IP est valide";
}
?>
Résultat attendu :
IP est inadmissible
192.168.0.1 appartient à la plage privée 192.168.0.0/16. Le format est correct, mais le drapeau la refuse quand même.
⚠ Ne confondez pas ce drapeau avec FILTER_FLAG_NO_RES_RANGE : l'un exclut les plages privées, l'autre les plages réservées — ce ne sont pas les mêmes adresses.
Étape 5 — Exclure les adresses réservées avec FILTER_FLAG_NO_RES_RANGE
D'autres plages sont réservées par l'IANA sans être privées à proprement parler — par exemple 0.0.0.0/8, non attribuable à un hôte. FILTER_FLAG_NO_RES_RANGE les exclut.
<?php
$ip = "0.0.0.0";
if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE))
{
echo "IP est inadmissible";
}
else
{
echo "IP est valide";
}
?>
Résultat attendu :
IP est inadmissible
0.0.0.0 appartient à la plage réservée 0.0.0.0/8. Le filtre la rejette même si le format IPv4 est valide.
Étape 6 — Combiner plusieurs drapeaux avec l'opérateur |
Les drapeaux se combinent avec l'opérateur bit à bit | pour cumuler plusieurs contraintes — ici, exiger de l'IPv4 tout en excluant les plages privées.
<?php
$ip = "8.8.8.8";
if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE))
{
echo "IP est inadmissible";
}
else
{
echo "IP est valide";
}
?>
Résultat attendu :
IP est valide
8.8.8.8 est une IPv4 publique, hors de toute plage privée : elle satisfait les deux contraintes combinées.
En résumé : FILTER_VALIDATE_IP valide le format d'une adresse IP, et les drapeaux FILTER_FLAG_IPV4, FILTER_FLAG_IPV6, FILTER_FLAG_NO_PRIV_RANGE et FILTER_FLAG_NO_RES_RANGE affinent cette validation selon la version et la plage d'appartenance.
Étape 7 — Exiger une adresse globalement routable avec FILTER_FLAG_GLOBAL_RANGE
Depuis PHP 8.2, le drapeau FILTER_FLAG_GLOBAL_RANGE n'accepte que les adresses globalement routables au sens de la RFC 6890 — les plages privées et réservées sont rejetées, comme avec les deux drapeaux précédents combinés.
<?php
$ip = "8.8.8.8";
if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_GLOBAL_RANGE))
{
echo "IP est inadmissible";
}
else
{
echo "IP est valide";
}
?>
Résultat attendu :
IP est valide
8.8.8.8 est une adresse globalement routable, elle passe la validation. Un test avec une adresse privée comme 192.168.0.1 échouerait, comme avec FILTER_FLAG_NO_PRIV_RANGE.
⚠ Ce drapeau nécessite PHP 8.2 ou supérieur. Sur une version antérieure, utilisez plutôt la combinaison FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE, dont le résultat est équivalent dans la plupart des cas.
Récapitulatif : le cycle complet en un seul script
<?php
$adresses = [
"192.168.0.1" => 0,
"2001:0db8:85a3:08d3:1319:8a2e:0370:7334" => FILTER_FLAG_IPV6,
"192.168.0.1 (privée)" => FILTER_FLAG_NO_PRIV_RANGE,
"0.0.0.0 (réservée)" => FILTER_FLAG_NO_RES_RANGE,
"8.8.8.8" => FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE,
];
foreach ($adresses as $label => $drapeau) {
$ip = trim(explode(" (", $label)[0]);
$valide = filter_var($ip, FILTER_VALIDATE_IP, $drapeau);
echo $label . " : " . ($valide ? "IP est valide" : "IP est inadmissible") . "\n";
}
?>
Résultat attendu :
192.168.0.1 : IP est valide 2001:0db8:85a3:08d3:1319:8a2e:0370:7334 : IP est valide 192.168.0.1 (privée) : IP est inadmissible 0.0.0.0 (réservée) : IP est inadmissible 8.8.8.8 : IP est valide
Pour plus de détail sur les drapeaux (FLAG) voir SVP notre référence compléte Drapeaux des filtres
Retourner à la liste des filtres
Par carabde : 20 août 2014 | Mis à jour le 17 juillet 2026