Funzione PHP per validationre IPv4 e IPv6 usando regex

Ho bisogno di creare una function per IPv4 e v6 che io possa utilizzare anche gli ip locali.

Quello che so è un range valido per IPv4 da 0.0.0.0 a 255.255.255.255 Ciò che so di IPv6 è limitato, tuttavia, nonostante sia in giro da un po 'di tempo, non ho avuto molta attenzione fino ad oggi. Ma voglio a prova di futuro la function che sto facendo un po ', mentre per il momento è un po' retrò. Non sono sicuro quali siano gli intervalli validi per IPv6.

In each caso, in generale, quello che sto pensando è una function nella misura di

function validateIP($ip, $vSix = NULL) { if($vSix !== NULL) { if(preg_match([regex-to-validate-ipv6], $ip)) { return true; } else { return false; } } if(preg_match([regex-to-validate-ipv4], $ip)) { return true; } else { return false; } } 

la mia cosa è che faccio schifo con regex quindi non ho idea di come scriverne uno che convalidi v4 o 6. Anche un controllo di integrità del concetto di function sopra sarebbe bello.

modificare

Si prega di consultare il commento di Natxet su questa risposta e la risposta di Morgon per una soluzione migliore.

Risposta originale

Puoi semplicemente usare inet_pton . Restituisce false se l'IP non è un IPv6 o IPv4 valido:

 function validateIP($ip){ return inet_pton($ip) !== false; } 

Controlla la function filter_var di PHP. Ha un numero di validatori , inclusi IPv4 e IPv6.

 $isValid = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); // $isValid can be evaluated as boolean, as it's FALSE if validation fails. 

provare

 //validates IPV4 and IPV6 $isValid = filter_var($ip, FILTER_VALIDATE_IP)); //validates IPV4 $isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV4)); //validates IPV6 $isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV6)); 

http://www.php.net/manual/en/filter.filters.validate.php

Potresti voler controllare in filter_var. Ha un filter per gli indirizzi IP (IPv4 e IPv6): http://us.php.net/manual/en/filter.filters.validate.php

Provare:

IPv4

 /^((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?1)){3}\z/ 

IPv6

 /^(((?=(?>.*?(::))(?!.+\3)))\3?|([\dA-F]{1,4}(\3|:(?!$)|$)|\2))(?4){5}((?4){2}|((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?7)){3})\z/i 

Da: http://home.deds.nl/~aeron/regex/

Oltre a Morgon e Mark Pro Campos risponde:

 function is_valid_ip($ip='', $ip_type=''){ $isValid=false; if($ip_type=='ipv4'){ //validates IPV4 $isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV4); } elseif($ip_type=='ipv6'){ //validates IPV6 $isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV6); } else{ //validates IPV4 and IPV6 $isValid = filter_var($ip, FILTER_VALIDATE_IP); } if($isValid == $ip){ $isValid=true; } return $isValid; } 

risorse

http://php.net/manual/en/function.filter-var.php