2012-03-07 10 views
15

Ho bisogno di creare una funzione per IPv4 e v6 che io provochi usare anche gli ip locali.Funzione PHP per convalidare IPv4 e IPv6 usando regex

Quello che so è un intervallo valido IPv4 da 0.0.0.0 a 255.255.255.255 Quello che so di IPv6 è limitato, tuttavia, nonostante sia in giro da un po 'non ho davvero guardato molto in esso fino ad oggi. Ma voglio a prova di futuro la funzione che sto facendo un po ', mentre per il momento è un po' retrò. Non sono sicuro quali siano gli intervalli validi per IPv6.

Comunque in generale quello che penso è una funzione 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 ho succhiare con regex quindi non ho idea di come scrivere uno che convaliderà v4 o 6. Anche un il controllo della sanità mentale sul concetto di funzione sopra sarebbe anche bello.

risposta

19

Modifica

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

risposta originale

Si può semplicemente utilizzare inet_pton. Restituisce false se l'IP non è un IPv6 valido o IPv4:

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

Man Devo fare qualche ricerca su php.net leggendo alcune di queste nuove funzioni che non avevo nemmeno realizzato. Questo è molto semplice e sexy. Penso che andrò con questo dopo averlo letto proprio ora. Complimenti! – chris

+2

Attenzione! Questa funzione genererà un avvertimento, e per favore non eliminarlo usando il nome della funzione @ before. Evitare l'uso di questa funzione per verificare un IP corretto. Come @ punti marc-pro-campos, l'opzione 'return filter_var ($ ip, FILTER_VALIDATE_IP));' sembra la migliore per te – Natxet

42

Controllare la funzione filter_var di PHP. Ha un number of validators, 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. 
+0

Impressionante idea, so perché mi f malato per ricordare che su, ma buona chiamata +1 – chris

+4

Questa dovrebbe essere la risposta accettata. –

+0

'$ isValid' è __not__' boolean'. Da docs: restituisce i dati filtrati o FALSE se il filtro non riesce. – schnittstabil

2

Prova:

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/

+0

cosa fa il \ z alla fine? – cwd

10

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

+0

Questo è il modo corretto. – tfont

1

Oltre a Morgon e Mark Pro Campos risposte:

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

Problemi correlati