Recuerda que en las ciencias un problema casi siempere suele tener varias resoluciones, pero aquí enseñamos la mejor y más eficiente.
Puede ser tarde, pero alguien podría intentar:
Ejemplo de dirección IP VÁLIDA
115.42.150.37
192.168.0.1
110.234.52.124
Ejemplo de dirección IP NO VÁLIDA
210.110 – must have 4 octets
255 – must have 4 octets
y.y.y.y – only digits are allowed
255.0.0.y – only digits are allowed
666.10.10.20 – octet number must be between [0-255]
4444.11.11.11 – octet number must be between [0-255]
33.3333.33.3 – octet number must be between [0-255]
Código JavaScript para validar una dirección IP
function ValidateIPaddress(ipaddress) [01]?[0-9][0-9]?).(25[0-5]
Prueba este, es una versión más corta:
^(?!0)(?!.*.$)((1?d?d|25[0-5]|2[0-4]d)(.|$))4$
Explicado:
^ start of string
(?!0) Assume IP cannot start with 0
(?!.*.$) Make sure string does not end with a dot
(
(
1?d?d| A single digit, two digits, or 100-199
25[0-5]| The numbers 250-255
2[0-4]d The numbers 200-249
)
.|$ the number must be followed by either a dot or end-of-string - to match the last number
)4 Expect exactly four of these
$ end of string
Prueba unitaria para la consola de un navegador:
var rx=/^(?!0)(?!.*.$)((1?d?d|25[0-5]|2[0-4]d)(.|$))4$/;
var valid=['1.2.3.4','11.11.11.11','123.123.123.123','255.250.249.0','1.12.123.255','127.0.0.1','1.0.0.0'];
var invalid=['0.1.1.1','01.1.1.1','012.1.1.1','1.2.3.4.','1.2.3n4','1.2.3.4n','259.0.0.1','123.','1.2.3.4.5','.1.2.3.4','1,2,3,4','1.2.333.4','1.299.3.4'];
valid.forEach(function(s)if (!rx.test(s))console.log('bad valid: '+s););
invalid.forEach(function(s)if (rx.test(s)) console.log('bad invalid: '+s););
La expresión regular que tienes ya tiene varios problemas:
En primer lugar, contiene puntos. En expresiones regulares, un punto significa “coincidir con cualquier carácter”, donde debe coincidir solo con un punto real. Para esto, debe escapar, así que coloque una barra invertida delante de los puntos.
En segundo lugar, pero está haciendo coincidir tres dígitos en cada sección. Esto significa que coincidirá con cualquier número entre 0 y 999, que obviamente contiene muchos números de direcciones IP no válidos.
Esto se puede resolver haciendo que la combinación de números sea más compleja; hay otras respuestas en este sitio que explican cómo hacerlo, pero, francamente, no vale la pena el esfuerzo; en mi opinión, sería mucho mejor dividir el string por los puntos, y luego simplemente validando los cuatro bloques como rangos de enteros numéricos, es decir:
if(block >= 0 && block <= 255) ....
Espero que ayude.
Aquí tienes las comentarios y valoraciones
Te invitamos a añadir valor a nuestra información cooperando tu experiencia en las críticas.