Expression régulière pour valider une adresse IP

 

L’extrait suivant est une expression régulière utilisé pour valider les adresses IP. Cette expression fonctionne aussi bien en JavaScript qu’en PHP ou en HTML, J’ai créer également des fonctions très utile qui utilise cette expression régulière regex pour vérifier si une adresse IP a un format valide.

Expression régulière regex IPv4
(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}
Expression régulière regex IPv6
(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

Version JavaScript

Le format dépend de la version, pour une IPv4, le format est le suivant 0.0.0.0.

Pour une IPv6, 2001:0db8:3c4d:0015:0000:d234::3eee:0000

La fonction prend en paramètre une adresse IP en chaine de caractères et lance ensuite une comparaison avec l’expression régulière. S’il ne respecte pas le format, la fonction retourne false, si l’adresse IP respecte le format, la fonction retourne true.

expression régulière adresse ip javascript
/**
 * Valider une ip avec une expression régulière
 * 
 * Si l'ip n'est pas valide, retourne false sinon retourne IPv4 ou IPv6
 * 
 * @param ip
 * @return Boolean
 */
function validateIP(ip){

    if(isIPv4(ip)) {
        return 'IPv4';
    } elseif (isIPv6(ip)) {
        return 'IPv6';
    }
    
    return false;
}

/**
 * Valider une IPv4 avec une expression régulière
 * 
 * Si l'ip n'est pas valide, retourne false
 * 
 * @param ip
 * @return Boolean
 */
function isIPv4(ip){
    var Reg = new RegExp(/^(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}/i);
    return Reg.test(ip);
}


/**
 * Valider une IPv6 avec une expression régulière
 * 
 * Si l'ip n'est pas valide, retourne false
 * 
 * @param ip
 * @return Boolean
 */
function isIPv6(ip){
    var Reg = new RegExp(/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/i);
    return Reg.test(ip);
}

Version JavaScript

Une des façons d’utiliser cette expression régulière est avec une condition IF comme ci-dessous.

let ip;
if(ip = validateIP('192.168.0.1')){
  alert(ip + "valide");
} else {
  alert("Adresse IP Invalide");
}

if(ip = validateIP('2001:0db8:3c4d:0015:0000:d234::3eee:0000')){
  alert(ip + "valide");
} else {
  alert("Adresse IP Invalide");
}

Version PHP

Pour obtenir uen adresse IP en PHP, vous pouvez vous fier à $_SERVER[‘REMOTE_ADDR’] qui contient l’adresse IP réelle de la partie qui se connecte. C’est la valeur la plus fiable que vous puissiez trouver.

Cependant, elle peut se trouver derrière un serveur proxy, auquel cas le proxy peut avoir défini la valeur $_SERVER[‘HTTP_X_FORWARDED_FOR’], mais cette valeur est facilement usurpée. Par exemple, elle peut être définie par quelqu’un sans proxy, ou l’IP peut être une IP interne du LAN derrière le proxy.

Cela signifie que si vous enregistrez la valeur $_SERVER[‘HTTP_X_FORWARDED_FOR’], veillez à enregistrer également la valeur $_SERVER[‘REMOTE_ADDR’]. Par exemple, en enregistrant les deux valeurs dans des champs différents de votre base de données.

Si vous enregistrez l’adresse IP dans une base de données sous la forme d’une chaîne, assurez-vous de disposer d’un espace d’au moins 45 caractères. L’IPv6 est là pour rester et ces adresses sont plus grandes que les anciennes adresses IPv4.

expression régulière adresse ip php
/**
 * Valider une ip avec une expression régulière
 * 
 * Si l'ip n'est pas valide, retourne false sinon retourne IPv4 ou IPv6
 * 
 * @param $ip
 * @return Boolean
 */
function validateIP($ip){

    if(isIPv4($ip)) {
        return 'IPv4';
    } elseif (isIPv6($ip)) {
        return 'IPv6';
    }
    
    return false;
}

/*
 * Valide IPv4
 * @param $ip
 */
 function isIPv4($ip)
 {
    return preg_match('/^(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}/i', $ip);
}

/*
 * Valide IPv6
 * @param $ip
 */
 function isIPv6($ip)
 {
    return preg_match('/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/i', $ip);
 }
if ($ip = validateIP($_SERVER['REMOTE_ADDR']) {
    echo "Mon IP est une " . $ip;
    // Mon IP est une IPv4
} else {
    echo "IP Invalide !";
}

Version HTML

Vous pouvez créer également des champs pour vérifier si celui-ci est valide ou non via l’attribut pattern de <input>. Attention, c’est utile uniquement pour afficher l’information visuellement à l’utilisateur qu’il a mal renseigner les champs par exemple avec une bordure rouge.

expression régulière adresse ip html
<input
      name="ip"
      type="text"
      pattern="(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}"
      placeholder="#.#.#.#"
     />

See the Pen Untitled by Damien Flandrin (@dam62500) on CodePen.0

Newsletter

Ne manquez jamais les nouveaux conseils, tutoriels et autres.

Pas de spam, jamais. Nous ne partagerons jamais votre adresse électronique et vous pouvez vous désabonner à tout moment.