
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
(\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
(([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
/**
* 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.
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.
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
/**
* 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);
}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
<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


