Algunas observaciones:
- Su expresión regular solo funcionará con IPv4, con la notación decimal punto (1)
- Como señaló Lee Byron, permitirá direcciones IP como 999.999.999.999, que no es válida.
- Debería usar literales de expresión regular, para evitar el doble escape, y esto es (creo) más sencillo de escribir. En lugar de escribir esto:
var r = new RegExp("my\\.regex", "gi");
puedes escribir esto:
var r = /my\.regex/gi;
Tenga en cuenta que deberá escapar de las barras inclinadas, y no le permite crear expresiones regulares dinámicas (como en el
).new RegExp("foo"+bar, flags)
- No necesita usar el método
cuando solo desea verificar si una expresión regular coincide con una cadena, es más eficiente usar el método deexec
, que devuelvetest
otrue
.false
Parece que desea escribir una función única para validar entradas basadas en una expresión regular dada. Aquí hay una versión reescrita que usa literales de expresiones regulares y un objeto para almacenar expresiones regulares:
var regexes = { // Here we store the regular expressions // Your regular expression ip : /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/gi }; function validInput(userInput, inputType) { // If there's no regular expression for this input type, that is, there's // no inputType's value key in the 'regexes' object. if (!(inputType in regexes)) { return false; } return regexes[inputType].test(userInput); }
Entonces, llamarás a la función así:
- ¿Cuál es la diferencia entre la dirección IP y la máscara de subred?
- ¿Los usuarios de datos móviles también tienen dirección IP?
- ¿Qué es una subred IP?
- ¿Son iguales las direcciones de puerta de enlace y puerto?
- ¿Cómo podría un sitio web saber que anteriormente había iniciado sesión en función de mi IP, si estaba usando TOR?
var badIPIsValid = validInput("999.999.999.999", "ip"); alert(badIPIsValid); // true (for now)
Ahora veamos la expresión regular:
- Como señaló Evan Priestley, es mejor usar
lugar de\d
:[0-9]
/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/gi
- Aquí, es inútil tener la bandera “i”, ya que usamos números, y la bandera “g”, ya que estamos validando una dirección IP. Entonces podemos despojarlos:
/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/
- La expresión regular también funciona para cadenas como
, porque solo estamos probando si la expresión regular puede coincidir con una parte de la cadena, pero no con toda la cadena. Así que agreguemos un símbolo de intercalación ("phone number : 1.456.789.0 :)"
) al comienzo, para que coincida con el comienzo de la cadena, y un signo de dólar (^
) al final para que coincida con el final de la cadena:$
/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
- Todavía tenemos el problema
. Creo que la forma más fácil de hacerlo es usar la función de Lee Byron, pero intentemos usar una expresión regular. El primer desafío es hacer una expresión regular que coincida solo con enteros positivos por debajo de 256. Aquí hay uno:"999.999.999.999"
/^(?:(?:0|1)?\d{1,2}|2(?:[0-4]\d|5[0-5]))$/
Coincide con números que comienzan con un 0 o 1 seguido de uno o dos dígitos, o números con solo uno o dos dígitos, o números que comienzan con un 2 y seguidos por un número entre 0 y 4 (incluido) y un dígito, o por un 5 seguido de un número entre 0 y 5.Ahora es fácil, tenemos que usar la expresión regular cuatro veces:
/^(?:(?:0|1)?\d{1,2}|2(?:[0-4]\d|5[0-5]))\.(?:(?:0|1)?\d{1,2}|2(?:[0-4]\d|5[0-5]))\.(?:(?:0|1)?\d{1,2}|2(?:[0-4]\d|5[0-5]))\.(?:(?:0|1)?\d{1,2}|2(?:[0-4]\d|5[0-5]))$/
- Opcionalmente, puede acortar la expresión regular:
/^(?:(?:(?:0|1)?\d{1,2}|2(?:[0-4]\d|5[0-5]))\.){3}(?:(?:0|1)?\d{1,2}|2(?:[0-4]\d|5[0-5]))$/
- Así que aquí estamos, aquí está el código completo:
var regexes = { // Here we store the regular expressions // Your regular expression ip : /^(?:(?:(?:0|1)?\d{1,2}|2(?:[0-4]\d|5[0-5]))\.){3}(?:(?:0|1)?\d{1,2}|2(?:[0-4]\d|5[0-5]))$/ }; function validInput(userInput, inputType) { // If there's no regular expression for this input type, that is, there's // no inputType's value key in the 'regexes' object. if (!(inputType in regexes)) { return false; } // .test is more efficient than .match when you just // want to test if a regular expression matches a string. return regexes[inputType].test(userInput); }
También puede acortar la función
:validInput
function validInput(userInput, inputType) { return ((inputType in regexes) && regexes[inputType].test(userInput)); }
Usando las tablas de direcciones válidas que se muestran en [1], podemos probar nuestra implementación con una serie de pruebas:
var valid, isValidIPv4; valid = { yes: [ "0.0.0.0", "10.0.0.0", "100.64.0.0", "127.0.0.0", "169.254.0.0", "172.16.0.0", "192.0.0.0", "192.0.2.0", "192.88.99.0", "192.168.0.0", "198.18.0.0", "198.51.100.0", "203.0.113.0", "224.0.0.0", "240.0.0.0", "255.255.255.255" ], no: [ "999.999.999.999", 0, "", null, undefined, NaN, "string", [], {}, true, 1 ] }; isValidIPv4 = function( value ) { return validInput( value, "ip" ); }; Object.keys(valid).forEach(function( type, k ) { var expect = type === "yes" ? true : false; console.log( valid[ type ].filter(function( value ) { var result = isValidIPv4(value); if ( isValidIPv4(value) === expect ) { // If the test passes, it's filtered from the list return false; } console.log( "TEST FAILED", value ); return true; }).length === 0 ? "PASS" : "FAIL" ); }); // The expected output should be: "PASS" "PASS"
Notas:
[1]: Hay otras anotaciones, cf: http://en.wikipedia.org/wiki/IPv…