Expresión regular para validar una dirección IP (IPv4 e IPv6)

Expresión regular para validar una dirección IP (IPv4 e IPv6)

El siguiente fragmento es una expresión regular para validar direcciones IP. Funciona igual de bien en JavaScript, en PHP o en HTML, y he preparado además unas funciones muy prácticas que usan esta expresión regular para comprobar si una dirección IP tiene un formato válido.

Expresión regular regex IPv4

php
(\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}

Expresión regular regex IPv6

php
(([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]))

Versión JavaScript

El formato depende de la versión: para una IPv4 es este 0.0.0.0.

Para una IPv6, 2001:0db8:3c4d:0015:0000:d234::3eee:0000

La función recibe una dirección IP como cadena de texto y la compara con la expresión regular. Si no respeta el formato, devuelve false, si la dirección IP respeta el formato, devuelve true.

expresión regular dirección ip javascript

javascript
/**
 * Valida una IP con una expresión regular
 *
 * Si la IP no es válida, devuelve false; si no, devuelve IPv4 o IPv6
 *
 * @param ip
 * @return Boolean
 */
function validateIP(ip){

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

return false;
}

/**
 * Valida una IPv4 con una expresión regular
 *
 * Si la IP no es válida, devuelve 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);
}

/**
 * Valida una IPv6 con una expresión regular
 *
 * Si la IP no es válida, devuelve 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);
}

Versión JavaScript

Una de las formas de usar esta expresión regular es dentro de una condición IF, como aquí abajo.

javascript
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");
}

See the Pen
Valider une adresse IP avec une expression régulière
by Damien Flandrin (@dam62500)
on CodePen.0

Versión PHP

Para obtener una dirección IP en PHP puedes fiarte de$_SERVER[‘REMOTE_ADDR’] que contiene la dirección IP real de quien se conecta. Es el valor más fiable que vas a encontrar.

Ahora bien, puede estar detrás de un servidor proxy, y en ese caso el proxy habrá definido el valor $_SERVER[‘HTTP_X_FORWARDED_FOR’], pero ese valor se falsifica con facilidad. Por ejemplo, lo puede definir alguien que no usa ningún proxy, o la IP puede ser una IP interna de la LAN que hay detrás del proxy.

Es decir que, si guardas el valor $_SERVER[‘HTTP_X_FORWARDED_FOR’], guarda también el valor $_SERVER[‘REMOTE_ADDR’]. Por ejemplo, en dos campos distintos de tu base de datos.

Si guardas la dirección IP en una base de datos como cadena de texto, reserva un espacio de al menos 45 caracteres. IPv6 ha venido para quedarse y sus direcciones son más largas que las antiguas direcciones IPv4.

Atención

Ojo con lo que haces al guardar una IP en una base de datos: cumple el RGPD en tus aplicaciones.

expresión regular dirección ip php

php
/**
 * Valida una IP con una expresión regular
 *
 * Si la IP no es válida, devuelve false; si no, devuelve IPv4 o IPv6
 *
 * @param $ip
 * @return Boolean
 */
function validateIP($ip){

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

return false;
}

/*
 * Valida 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);
}

/*
 * Valida 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);
 }
php
if ($ip = validateIP($_SERVER['REMOTE_ADDR']) {
    echo "Mon IP est une " . $ip;
    // Mi IP es una IPv4
} else {
    echo "IP Invalide !";
}

Versión HTML

También puedes crear campos que comprueben si el valor es válido con el atributo pattern de <input>. Ojo: solo sirve para avisar visualmente al usuario de que ha rellenado mal el campo, por ejemplo con un borde rojo.

expresión regular dirección ip html

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

HTMLJavaScriptPHP

Damien Flandrin Desarrollador web desde 2010, creador de Gekkode y de Email Impact. Cada artículo se prueba en un proyecto real antes de publicarse. Contacto
Newsletter

Las nuevas pruebas, tutoriales y proyectos, por correo.

Pruebas reproducibles, código versionado, resultados fechados. Nunca spam.