
Il frammento che segue è un’espressione regolare per validare gli indirizzi IP. Funziona allo stesso modo in JavaScript, in PHP o in HTML, e ho preparato anche alcune funzioni pratiche che usano questa espressione regolare per verificare se un indirizzo IP ha un formato valido.
Espressione regolare 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}Espressione regolare 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]))Versione JavaScript
Il formato dipende dalla versione: per un IPv4 è questo 0.0.0.0.
Per un IPv6, 2001:0db8:3c4d:0015:0000:d234::3eee:0000
La funzione riceve un indirizzo IP come stringa di caratteri e lo confronta con l’espressione regolare. Se non rispetta il formato, restituisce false, se l’indirizzo IP rispetta il formato, restituisce true.
espressione regolare indirizzo ip javascript
/**
* Valida un IP con un'espressione regolare
*
* Se l'IP non è valido, restituisce false, altrimenti restituisce IPv4 o IPv6
*
* @param ip
* @return Boolean
*/
function validateIP(ip){
if(isIPv4(ip)) {
return 'IPv4';
} elseif (isIPv6(ip)) {
return 'IPv6';
}
return false;
}
/**
* Valida un IPv4 con un'espressione regolare
*
* Se l'IP non è valido, restituisce 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 un IPv6 con un'espressione regolare
*
* Se l'IP non è valido, restituisce 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);
}Usare la regex in JavaScript
Il modo più semplice di usare questa espressione regolare è dentro una condizione IF, come qui sotto.
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
Versione PHP
Per ottenere un indirizzo IP in PHP puoi affidarti a$_SERVER[‘REMOTE_ADDR’] che contiene l’indirizzo IP reale di chi si connette. È il valore più affidabile che puoi trovare.
Può però trovarsi dietro un server proxy: in quel caso il proxy può aver impostato il valore $_SERVER[‘HTTP_X_FORWARDED_FOR’], ma quel valore si falsifica facilmente. Per esempio può essere impostato da qualcuno che non usa alcun proxy, oppure l’IP può essere un indirizzo interno della LAN dietro il proxy.
Vuol dire che se registri il valore $_SERVER[‘HTTP_X_FORWARDED_FOR’], devi registrare anche il valore $_SERVER[‘REMOTE_ADDR’]. Per esempio salvando i due valori in campi diversi del tuo database.
Se registri l’indirizzo IP in un database sotto forma di stringa, assicurati di avere spazio per almeno 45 caratteri. L’IPv6 è qui per restare e questi indirizzi sono più lunghi dei vecchi indirizzi IPv4.
Attenzione però a quello che fai registrando un IP in un database: resta in regola con il GDPR nelle tue applicazioni.
espressione regolare indirizzo ip php
/**
* Valida un IP con un'espressione regolare
*
* Se l'IP non è valido, restituisce false, altrimenti restituisce 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);
}if ($ip = validateIP($_SERVER['REMOTE_ADDR']) {
echo "Mon IP est une " . $ip;
// Il mio IP è un IPv4
} else {
echo "IP Invalide !";
}Versione HTML
Puoi anche creare campi che verificano se il valore inserito è valido o no, tramite l’attributo pattern di <input>. Attenzione: serve soltanto a segnalare visivamente all’utente che ha compilato male il campo, per esempio con un bordo rosso.
espressione regolare indirizzo 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


