Expressão regular para validar um endereço IP (IPv4 e IPv6)

Expressão regular para validar um endereço IP (IPv4 e IPv6)

O excerto seguinte é uma expressão regular para validar endereços IP. Funciona tão bem em JavaScript como em PHP ou em HTML, e preparei ainda algumas funções bem práticas que usam esta expressão regular para verificar se um endereço IP tem um formato válido.

Expressão 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}

Expressão 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]))

Versão JavaScript

O formato depende da versão: para um IPv4 é este 0.0.0.0.

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

A função recebe um endereço IP como cadeia de caracteres e compara-o com a expressão regular. Se não respeitar o formato, devolve false, se o endereço IP respeitar o formato, devolve true.

expressão regular endereço ip javascript

javascript
/**
 * Valida um IP com uma expressão regular
 *
 * Se o IP não for válido, devolve false, senão devolve IPv4 ou IPv6
 *
 * @param ip
 * @return Boolean
 */
function validateIP(ip){

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

return false;
}

/**
 * Valida um IPv4 com uma expressão regular
 *
 * Se o IP não for válido, devolve 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 um IPv6 com uma expressão regular
 *
 * Se o IP não for válido, devolve 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);
}

Versão JavaScript

Uma das formas de usar esta expressão regular é dentro de uma condição IF, como aqui em baixo.

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

Versão PHP

Para obteres um endereço IP em PHP, podes confiar em$_SERVER[‘REMOTE_ADDR’] que contém o endereço IP real de quem se liga. É o valor mais fiável que vais encontrar.

Só que a ligação pode vir de trás de um servidor proxy e, nesse caso, o proxy terá definido o valor $_SERVER[‘HTTP_X_FORWARDED_FOR’], um valor fácil de falsificar. Pode ser definido por alguém que nem sequer usa proxy, ou o IP pode ser um IP interno da LAN que está atrás do proxy.

Ou seja: se guardares o valor $_SERVER[‘HTTP_X_FORWARDED_FOR’], guarda também o valor $_SERVER[‘REMOTE_ADDR’]. Por exemplo, em dois campos diferentes da tua base de dados.

Se guardares o endereço IP numa base de dados como cadeia de caracteres, reserva espaço para pelo menos 45 caracteres. O IPv6 veio para ficar e os seus endereços são maiores do que os antigos endereços IPv4.

Atenção

Cuidado com o que fazes ao guardar um IP numa base de dados: cumpre o RGPD nas tuas aplicações.

expressão regular endereço ip php

php
/**
 * Valida um IP com uma expressão regular
 *
 * Se o IP não for válido, devolve false, senão devolve IPv4 ou 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;
    // O meu IP é um IPv4
} else {
    echo "IP Invalide !";
}

Versão HTML

Também podes criar campos que verificam se o valor é válido com o atributo pattern do <input>. Atenção: só serve para avisar visualmente o utilizador de que preencheu mal o campo, por exemplo com um rebordo vermelho.

expressão regular endereço 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 Programador web desde 2010, criador da Gekkode e do Email Impact. Cada artigo é testado num projeto real antes de ser publicado. Contacto
Newsletter

Os novos testes, tutoriais e projetos, por e-mail.

Testes reproduzíveis, código versionado, resultados datados. Nunca spam.