2008-09-03 24 views
7

¿Cómo puedo determinar si una cadena es una dirección IP? ¿O IPv4 o IPv6?¿Cómo evaluar una IP?

¿Cuál es el número mínimo y la mayor cantidad de caracteres?

Supongo que esto sería una regex respuesta.

Respuesta

3

Pero la pregunta no es tan simple como asumir a.b.c.d ... there are way more forms than you realised.

Pero seguramente esta es una pregunta de Google por ella? Prácticamente cada imprimación regex que puede encontrar en cualquier lugar usa IP como ejemplo. ipv4 + regex puntajes 183,000 visitas!

+0

Pero como el enlace que proporcionó es un excelente artículo, elegí esta como la respuesta correcta. ;) – pek

4

Para IPv4 puede usar esta expresión regular.

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b 

Parece bastante complejo pero funciona limitando cada cuadrante a los números 0-255.

0

Dado que la mitad de esa expresión regular maneja el hecho de que el último segmento no tiene un punto al final, puede cortarlo a la mitad si coloca un '.' hasta el final de su posible dirección IP.

Algo como esto:

bool IsValidIPAddress(string possibleIP){ 
    CrazyRegex = \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4}\b 
    return Regex.Match(possibleIP+'.', CrazyRegex) 
} 
0

@unsliced: true, este problema puede ser un poco loco.

Si realmente necesita manejar cualquier dirección IP posible, entonces tendrá que armar algo más sofisticado.

Sin embargo, si solo quiere hacer una validación básica para asegurarse de que los usuarios están ingresando datos con el formato correcto, creo que es justo restringirlos al modelo a.b.c.d con las expresiones regulares anteriores.

0

@unsliced ​​que es correcto, pero por supuesto dependerá de la implementación, si está analizando un IP de un usuario que visita su sitio, entonces está bien usar regex, ya que DEBE estar en formato x.x.x.x.

Para IPv6 podría utilizar este

[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4} 

sin embargo, no captura todo porque con IPv6 es mucho más complicado, según wikipedia todos los siguientes ejemplos son technicaly correcta sin embargo la expresión regular anterior sólo se captura los que tienen un *

2001:0db8:0000:0000:0000:0000:1428:57ab* 
2001:0db8:0000:0000:0000::1428:57ab* 
2001:0db8:0:0:0:0:1428:57ab* 
2001:0db8:0:0::1428:57ab 
2001:0db8::1428:57ab 
2001:db8::1428:57ab 
6

En .NET hay un tipo de dirección IP que tiene un método práctico TryParse.

Ejemplo:

if(System.Net.IPAddress.TryParse(PossibleIPAddress, validatedIPAddress)){ 
    //validatedIPAddress is good 
} 

// or more simply: 
bool IsValidIPAddress(string possibleIP){ 
    return System.Net.IPAddress.TryParse(PossibleIPAddress, null) 
} 
5

que he hecho esto antes, pero me gusta el post de Raymond Chen en:

http://blogs.msdn.com/oldnewthing/archive/2006/05/22/603788.aspx

Donde básicamente aboga por el uso de expresiones regulares para lo que es bueno : analizar los tokens. Luego evalúa los resultados.Su ejemplo:

function isDottedIPv4(s) 
{ 
var match = s.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/); 
return match != null && 
     match[1] <= 255 && match[2] <= 255 && 
     match[3] <= 255 && match[4] <= 255; 
} 

Es mucho más fácil ver eso y asimilar lo que se supone que debe hacer.

+0

Lo probé en varias entradas. Parece a prueba de balas. –

-1

IPv4 se convierte en: /\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/

No estoy seguro acerca de las reglas IPv6.

Cuestiones relacionadas