logo oujood
🔍

Filtre PHP FILTER_VALIDATE_IP : valider une adresse IP

Valider une IPv4 ou IPv6 avec filter_var, et restreindre la validation avec les drapeaux FILTER_FLAG.
PHP cours tutorial

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.

  📋 Copier le code

<?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.

  📋 Copier le code

<?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.

  📋 Copier le code

<?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.

  📋 Copier le code

<?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.

  📋 Copier le code

<?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.

  📋 Copier le code

<?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.

  📋 Copier le code

<?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

  📋 Copier le code

<?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