Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Misma expresion regular para html5 y javascript

Estas en el tema de Misma expresion regular para html5 y javascript en el foro de Javascript en Foros del Web. Buenas. No es el primer tema que abro en el foro, pero espero que tenga más éxito que los otros, en los que no he ...
  #1 (permalink)  
Antiguo 11/09/2015, 16:54
 
Fecha de Ingreso: julio-2015
Ubicación: Madrid
Mensajes: 17
Antigüedad: 8 años, 9 meses
Puntos: 0
Misma expresion regular para html5 y javascript

Buenas.

No es el primer tema que abro en el foro, pero espero que tenga más éxito que los otros, en los que no he recibido ninguna respuesta y sigo con dudas XD. Es posible que estuvieran mal de alguna manera, pero es raro ya que no hay respuestas ni siquiera para insultar jaja.

En fin, vamos a mi duda.

Estoy haciendo una validación de un formulario tanto con el atributo pattern de HTML5 como con JS (y si ambos pasan haré la validación final en servidor).
El caso es que quiero que el JS tenga el menor número posible de variables con valores literales (escritos a mano en el mismo JS), para que me pueda servir para otros ficheros HTML con el menor número de modificaciones posibles.
Así pues, todas las variables que necesito recogen el valor del HTML de forma dinámica y si en algún momento cambio algo, no tendré que modificar el JS.

El problema está en que el atributo pattern y las funciones para buscar expresiones regulares de JS no funcionan igual.

El campo que me da problemas es el de Nombre. Quiero que sólo se puedan introducir letras y espacios (ya tengo la validación por si sólo se ponen espacios en blanco).
Código HTML:
Ver original
  1. <input id="nombre" name="nombre" type="text" required="required" [B]pattern="[a-zA-zÑñáéíóúüÁÉÍÓÚÜ ]+"[/B] title="Sólo se permiten letras" maxlength="50" />

Ya he comprobado que canta si se introduce cualquier otro valor.

Entonces lo recojo en JS así:
Código Javascript:
Ver original
  1. pattern = campo.getAttribute('pattern');

La peli viene en que no sé cómo hacer que cante si encuentra otro carácter, porque tanto .test() como .match() dan true si encuentran el patron en el valor, aunque tenga otros caracteres.
Es decir:
Código Javascript:
Ver original
  1. alert("Probamos con test()");
  2. alert(/[a-zA-zÑñáéíóúüÁÉÍÓÚÜ ]+/.test("asd")); // true
  3. alert(/[a-zA-zÑñáéíóúüÁÉÍÓÚÜ ]+/.test("asd asd")); // true
  4. alert(/[a-zA-zÑñáéíóúüÁÉÍÓÚÜ ]+/.test(" asd ")); // true
  5. alert(/[a-zA-zÑñáéíóúüÁÉÍÓÚÜ ]+/.test("asd12")); // true
  6. alert(/[a-zA-zÑñáéíóúüÁÉÍÓÚÜ ]+/.test("asd12asd")); // true
  7. alert(/[a-zA-zÑñáéíóúüÁÉÍÓÚÜ ]+/.test("12")); // false
  8.  
  9. alert("/////////");
  10.  
  11. alert("Probamos con match()");
  12. alert("asd".match(/[a-zA-zÑñáéíóúüÁÉÍÓÚÜ ]+/)); // asd
  13. alert("asd asd".match(/[a-zA-zÑñáéíóúüÁÉÍÓÚÜ ]+/)); // asd asd
  14. alert(" asd ".match(/[a-zA-zÑñáéíóúüÁÉÍÓÚÜ ]+/)); // asd (probablemente también ponga los espacios, pero es difícil de decir ;)
  15. alert("asd12".match(/[a-zA-zÑñáéíóúüÁÉÍÓÚÜ ]+/)); // asd
  16. alert("asd12asd".match(/[a-zA-zÑñáéíóúüÁÉÍÓÚÜ ]+/)); // asd
  17. alert("12".match(/[a-zA-zÑñáéíóúüÁÉÍÓÚÜ ]+/)); // null

Pues bien, a ver si hay suerte y alguien puede ayudarme.
Lo que necesito es una sola expresión regular que me sirva en ambas validaciones o un método de JS que encuentre coincidencias exactas entre la cadena y el patrón.
O también me sirve cualquier otra idea que se os ocurra.

Gracias de antemano.
Un saludo;
  #2 (permalink)  
Antiguo 11/09/2015, 17:46
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Misma expresion regular para html5 y javascript

Podrías utilizar el objeto RegExp para crear una expresión regular con el patrón dado. Además, tienes la posibilidad de añadir modificadores de patrón, como la "g" para búsquedas globales y la "i" para no hacer diferencias entre mayúsculas y minúsculas.

Código Javascript:
Ver original
  1. var regexp = new RegExp(elemento.pattern, "gi");

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 12/09/2015, 04:33
 
Fecha de Ingreso: julio-2015
Ubicación: Madrid
Mensajes: 17
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Misma expresion regular para html5 y javascript

Gracias por la respuesta, pero como dicen en el foro de Steam, "not work for me".

He buscado el objeto RegExp pero apenas encuentro documentación.
En realidad ya lo estaba usando, solo que sin los flags "g" e "i", aunque tampoco me ha servido.

Vuelvo a describir el problema:
Las funciones de expresiones regulares en JS buscan una coincidencia entre toda la cadena y yo necesito que toda la cadena sea una única coincidencia.

He seguido avanzando y resulta que me pasa lo mismo con la validación del Email.
He usado una regexp típica para esto, que he encontrado en alguna web:
/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+){0,}(\.[a-z]{2,4})$/gi (se pueden agregar flags como si del constructor de RegExp se tratase).
No hace lo que se supone que tiene que hacer. Resulta que si pongo la cadena "aaaa@aaaa" da positivo en la búsqueda. A pesar de que se le está diciendo que antes de los {2,4} últimos caracteres tiene que llevar si o si un ".", pero lo más curioso es que si la cadena es "aaaa@aaa" (tres caracteres después de la "@" en lugar de cuatro) la búsqueda es negativa.

No entiendo mucho de expresiones regulares y sé que se me puede estar escapando algo, pero la he comprobado en [URL="http://regexper.com/"]Regexper[/URL], y he probado su comportamiento en [URL="http://www.regexr.com/"]RegExr[/URL], [URL="http://regexpal.com/"]Regexpal[/URL] y [URL="http://www.metriplica.com/es/recursos/expresiones-regulares"]Metriplica[/URL], y en todas me da el resultado que se supone que tiene que dar, mas corriéndolo en JS hace lo que le sale del ****.

Estoy realmente quemado con esto jaja.

Saludos;
  #4 (permalink)  
Antiguo 12/09/2015, 09:20
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 8 meses
Puntos: 578
Respuesta: Misma expresion regular para html5 y javascript

Código HTML:
Ver original
  1. <input type="email">

  #5 (permalink)  
Antiguo 12/09/2015, 09:59
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Misma expresion regular para html5 y javascript

Cita:
Iniciado por jevy99 Ver Mensaje
He buscado el objeto RegExp pero apenas encuentro documentación [...]
Cita:
Iniciado por Alexis88 Ver Mensaje
Podrías utilizar el objeto RegExp [...]
La palabra resaltada en anaranjado, es un enlace que te redirigirá hacia la documentación ofrecida por la MDN, la cual es una de las más fidedignas que hay en la web, junto con la de ECMAScript y la W3.

En cuanto a la validación que comentas con el e-mail, ¿estás seguro? Acabo de hacer la prueba y no ocurre lo que dices.

De cualquier forma, tienes a disposición el <input type="email"> de HTML5 para evitar validar manualmente el correo electrónico ingresado por el usuario, aunque, para validar del lado del servidor, sí será necesario el uso de la expresión regular.

Un saludo
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #6 (permalink)  
Antiguo 12/09/2015, 15:34
 
Fecha de Ingreso: julio-2015
Ubicación: Madrid
Mensajes: 17
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Misma expresion regular para html5 y javascript

Buenas.

En primer lugar, gracias a los dos, pero esto ya es algo personal.

Cita:
En cuanto a la validación que comentas con el e-mail, ¿estás seguro? Acabo de hacer la prueba y no ocurre lo que dices.
La verdad es que ya no estoy seguro de nada, pero ya dije que las pruebas en validadores online me daban correctas, no así al ejecutar mi script. He hecho la siguiente prueba (es un fichero entero para que sólo haya que copiar en un documento html y ejecutarlo):
Código HTML:
Ver original
  1. <!DOCTYPE html>
  2.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  3.     <script type="text/javascript">
  4.         window.onload = function() {
  5.             var campoNombre = document.getElementById('nombre');
  6.             var campoEmail = document.getElementById('email');
  7.             var boton = document.getElementById('boton_enviar');
  8.             var regNombre = new RegExp("[a-zA-zÑñáéíóúüÁÉÍÓÚÜ\s]+", "gi");
  9.             var regEmail = new RegExp("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+){0,}(\.[a-z]{2,4})$", "gi");
  10.  
  11.             boton.onclick = function() {
  12.                 if(/*validarFormato(campoNombre, regNombre)
  13.                         &&*/ validarFormato(campoEmail, regEmail)) {
  14.                     document.getElementById('form').submit();
  15.                 }
  16.             }
  17.         }
  18.  
  19.         function validarFormato(campo, reg) {
  20.             console.log("PRIMERO: " + reg + " .test() " + campo.value + " = " + reg.test(campo.value));
  21.             var cadena = "aaaa@aaaa";
  22.             alert(reg.test(cadena));
  23.             alert(reg.test(cadena));
  24.             alert(reg.test(cadena));
  25.             alert(reg.test(cadena));
  26.             if(reg.test(campo.value)) {
  27.                 console.log("SEGUNDO: solo debería entrar si es true: " + reg + " .test() " + campo.value + " = " + reg.test(campo.value));
  28.                 console.log("true: " + campo.id);
  29.                 document.getElementById('err_' + campo.id + '_valid').style.display = 'none';
  30.                 return true;
  31.             } else {
  32.                 console.log("TERCERO: solo debería entrar si es false: " + reg + " .test() " + campo.value + " = " + reg.test(campo.value));
  33.                 console.log("false: " + campo.id);
  34.                 document.getElementById('err_' + campo.id + '_valid').style.display = 'block';
  35.                 return false;
  36.             }
  37.         }
  38.     </script>
  39.     <style type="text/css">
  40.         .label_error {
  41.             color: #f00;
  42.             display: none;
  43.         }
  44.     </style>
  45.     <title>prueba</title>
  46. </head>
  47.     <form id="form" method="post" action="#">
  48.         <label for="nombre">Nombre</label><br />
  49.         <input id="nombre" name="nombre" type="text" required="required" pattern="[a-zA-zÑñáéíóúüÁÉÍÓÚÜ\s]+" title="Sólo se permiten letras" maxlength="50" data-patron="1" /><br />
  50.         <label id="err_nombre_valid" class="label_error">Este campo sólo admite letras</label>
  51.  
  52.         <label for="email">Email</label><br />
  53.         <input id="email" name="email" type="text" required="required" pattern="^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+){0,}(\.[a-z]{2,4})$" title="Dirección de correo electrónico válida" data-patron="0" /><br />
  54.         <label id="err_email_valid" class="label_error">Introduce un email válido</label>
  55.  
  56.  
  57.         <input id="boton_enviar" type="submit" title="Enviar" value="Enviar" />
  58.     </form>
  59. </body>
  60. </html>

Y resulta que cada vez que hace el test(), si tiene que dar true, los valores se alternan.
Es decir, que si el patrón debe dar false, va a dar false todo el rato, pero si debe dar true, cada vez par que ejecute el test() da false.
Fíjate de todas formas en que alert(reg.test("aaaa@aaaa")); da true como primer resultado.

No entiendo nada.

A, y por cierto, ya me fijé en que me dabas un enlace, pero tampoco me sirvió. Gracias de todas formas.

Un saludo;
  #7 (permalink)  
Antiguo 12/09/2015, 16:41
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Misma expresion regular para html5 y javascript

El error salta a la vista: estás permitiendo que, luego del texto que va luego del arroba y antes del punto, hayan cero o más caracteres. Ese es el error, que permites ingresar un "ejemplo@dominio" cuando debería de ser "[email protected]".

Cambia esto:

Código Javascript:
Ver original
  1. var regEmail = new RegExp("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+){0,}(\.[a-z]{2,4})$", "gi");

Por esto:

Código Javascript:
Ver original
  1. var regEmail = new RegExp("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+){1,}(\.[a-z]{2,4})$", "gi");

DEMO

Cita:
Iniciado por jevy99 Ver Mensaje
A, y por cierto, ya me fijé en que me dabas un enlace, pero tampoco me sirvió [...]
Jamás digas eso. Toda información siempre es útil y valiosa; que no le hayas podido sacar partido porque no la entendiste, no quiere decir que "no te haya servido". Y si no entiendes algo, pregunta. Es gratis (al menos acá ).

Un saludo
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #8 (permalink)  
Antiguo 13/09/2015, 08:57
 
Fecha de Ingreso: julio-2015
Ubicación: Madrid
Mensajes: 17
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Misma expresion regular para html5 y javascript

Cita:
Iniciado por Alexis88 Ver Mensaje
El error salta a la vista: estás permitiendo que, luego del texto que va luego del arroba y antes del punto, hayan cero o más caracteres. Ese es el error, que permites ingresar un "ejemplo@dominio" cuando debería de ser "[email protected]".
Ferpecto, una cosa menos. Gracias!!

Cita:
Iniciado por Alexis88 Ver Mensaje
Jamás digas eso. Toda información siempre es útil y valiosa; que no le hayas podido sacar partido porque no la entendiste, no quiere decir que "no te haya servido". Y si no entiendes algo, pregunta. Es gratis (al menos acá ).
Bueno, me refería al contexto. Me valió para saber cómo meter los flags en el constructor de RegExp(), pero no me solucionó la peli.

Pero aún quedan dos cosas:

1. Solucionar lo del nombre. Lo que se me ha ocurrido es ponerle el símbolo de negación "^", por ejemplo, preguntando en un if(si el patrón es para sólo letras) {le metes la negación para que quede así: "[^a-zA-zÑñáéíóúüÁÉÍÓÚÜ\s]+", y si encuentra algo que no valide.

2. ¿Alguien sabe por qué se alternan los resultados cuando se hacen varios test() seguidos y tiene que dar sólo true?

Un saludo;
  #9 (permalink)  
Antiguo 15/09/2015, 06:27
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Misma expresion regular para html5 y javascript

ese patrón no es correcto ya que admite algo como "juan andrés de todos los santos ruiz de alarcón cuesta". un nombre puede ser simple o compuesto

Cita:
/^(([a-z\xc0-\xff]+)((\s)([a-z\xc0-\xff]+))?)$/i
para la segunda pregunta lee este post
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #10 (permalink)  
Antiguo 15/09/2015, 12:59
 
Fecha de Ingreso: julio-2015
Ubicación: Madrid
Mensajes: 17
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Misma expresion regular para html5 y javascript

Buenas.

Muy bueno lo del flag global en el patrón. Ya daba este tema por perdido. De hecho he creado una función para validar el email. Muchísimas gracias.
Ya no es necesaria la función, pero por si a alguien le sirviera, igual que a mi me habéis ayudado no está demás que yo lo intente con otras personas, es esta:
Código Javascript:
Ver original
  1. function validarEmail(email) {
  2.     var carProhibidos = " ;:,/\\|\"\'$#%()=";
  3.     for(i = 0; i < carProhibidos.length; i++) {
  4.         var noValido = carProhibidos.charAt(i)
  5.        
  6.         if(email.indexOf(noValido, 0) > -1) {
  7.             return false;
  8.         }
  9.     }
  10.    
  11.     var arroba = email.indexOf("@", 1);
  12.     if(arroba == -1) {
  13.         return false;
  14.     } else {
  15.         if(email.indexOf("@", arroba + 1) > -1) {
  16.             // Si hay otra @ después de la primera
  17.             return false;
  18.         } else {
  19.  
  20.             var posPunto = email.indexOf(".", arroba + 1);
  21.             if(posPunto == -1) {
  22.                 return false;
  23.             } else if(posPunto == arroba + 1) {
  24.                 return false;
  25.             } else {
  26.  
  27.                 var ultimaPosicion = posPunto;
  28.                 while(posPunto > -1) {
  29.                     // Mientras que no haya más puntos después del anterior
  30.                     posPunto = email.indexOf(".", ultimaPosicion + 1);
  31.                     if(posPunto == ultimaPosicion + 1) {
  32.                         // Hay dos puntos seguidos
  33.                         return false;
  34.                     }
  35.                     if(posPunto > -1) {
  36.                         // Hará otra iteración
  37.                         ultimaPosicion = posPunto;
  38.                     }
  39.                 }
  40.                 if(ultimaPosicion + 2 >= email.length || ultimaPosicion + 4 < email.length){
  41.                     // Si tiene 1 o más de 3 caracteres tras el último punto
  42.                     return false;
  43.                 }      
  44.             }
  45.         }
  46.     }
  47.     return true;
  48. }

En cuanto a lo que dices de la otra expresión regular, no sé si te entiendo. No veo ningún problema en que haya nombres compuestos y si es uno demasiado largo ya tengo puesto un maxlength. Y, como veo que no lo he dicho antes, sólo tengo un input para nombres y apellidos, y por eso lo de permitir espacios.

Muchas gracias.

Un saludo;
  #11 (permalink)  
Antiguo 16/09/2015, 05:18
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Misma expresion regular para html5 y javascript

no importa que el campo sea también los apellidos, la expresión sigue siendo incorrecta. la expresión admite espacios al principio y al final de la cadena, y puede haber más de 1 espacio entre las subcadenas. una expresión más adecuada sería esta

Cita:
/^([a-z\xc0-\xff])(([a-z\xc0-\xff]+)(\s))+([a-z\xc0-\xff]+)$/i
por otro lado si vas a validar el email usando una función te recomiendo esta http://www.forosdelweb.com/f13/faqs-...ml#post2470633
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #12 (permalink)  
Antiguo 17/09/2015, 14:32
 
Fecha de Ingreso: julio-2015
Ubicación: Madrid
Mensajes: 17
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Misma expresion regular para html5 y javascript

Buenas.

No he tenido tiempo de probarlo, pero quería pasar a agradecéroslo. Es lo menos después de la ayuda recibida.
Intentaré mirarlo el sábado y responder con los resultados, aunque son prometedores.

Un saludo;
  #13 (permalink)  
Antiguo 19/09/2015, 13:47
 
Fecha de Ingreso: julio-2015
Ubicación: Madrid
Mensajes: 17
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Misma expresion regular para html5 y javascript

Buenas noches.

Ya lo he probado y el resultado es excelente.
En el nombre uso la misma expresión regular, la que proporcionas, para validar en el html (pattern) y en el js, y con el mail uso la función que indicas.
Todo funciona correctamente.

Muchas gracias.
Un saludo;

Etiquetas: expresiones_regulares, html5, javascript+html, js, regexp
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:41.