2012-03-07 29 views
15

Necesito crear una función para IPv4 y v6 que cause el uso de la ip local también.Función de PHP para validar IPv4 e IPv6 usando regex

Lo que sé es que un IPv4 válido oscila entre 0.0.0.0 y 255.255.255.255 Lo que sé de IPv6 es limitado, sin embargo, a pesar de que lleva un tiempo, no lo he visto demasiado hasta el día de hoy. Pero quiero probar en el futuro la función que estoy haciendo un poco mientras lo mantengo un poco retro por el momento. No estoy seguro de cuáles son los rangos válidos para IPv6.

De todos modos En general lo que estoy pensando es una función de la magnitud de

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; 
    } 
} 

mi cosa es que chupar con expresiones regulares así que no tengo idea de cómo escribir uno que validará v4 o 6. También una la verificación de la cordura en el concepto de función anterior sería agradable también.

Respuesta

19

Editar

Por favor, vea el comentario de Natxet en esta respuesta, y la respuesta de Morgon una solución mejor.

respuesta original

sólo puede utilizar inet_pton. Devuelve false si la propiedad intelectual no es un IPv6 válida o IPv4:

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

Hombre Tengo que ponerme al día en php.net leyendo algunas de estas funciones más nuevas que ni siquiera me había dado cuenta. Esto es muy simple y sexy. Creo que voy a ir con esto después de leer sobre esto ahora. ¡Prestigio! – chris

+2

¡Cuidado! Esta función lanzará una advertencia, y por favor no elimine eso usando @ antes del nombre de la función. Debe evitar el uso de esta función para verificar una IP correcta. Como puntos @ marc-pro-campos, la opción 'return filter_var ($ ip, FILTER_VALIDATE_IP));' parece ser la mejor para usted – Natxet

42

Compruebe la función filter_var de PHP. Tiene un number of validators, que incluye 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

idea genial, sé por qué me f Ailed recordar que en, pero buena llamada +1 – chris

+4

Esta debería ser la respuesta aceptada. –

+0

'$ isValid' es __not__' boolean'. De los documentos: devuelve los datos filtrados o FALSO si el filtro falla. – schnittstabil

2

Probar:

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 

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

+0

¿Qué hace el \ z al final? – cwd

10

tratar

//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

Esta es la forma correcta. – tfont

1

Además de Morgon y Mark Pro Campos respuestas:

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; 
} 

Recursos

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

Cuestiones relacionadas