Validar un email en JavaScript

Pregunta

¿Cómo validar un email que acepte todos los caracteres latinos?

Por caracteres latinos me refiero a letras acentuadas, ñ, ç, y todas las usadas por idiomas como español, portugués, italiano… latinos.

Contexto

El objetivo es mostrar un icono al lado del texto a medida que el usuario va tipeando su dirección de mail.
No me interesa aceptar todos los casos válidos. Fue una decisión de diseño abarcar sólo los mails más frecuentes. Es decir, letras (incluyendo acentos y similares) y los símbolos ._%+-.
Puedo usar código de otras fuentes, siempre y cuando sean populares (ej: jQuery).

Código

document.getElementById(’email’).addEventListener(‘input’, function() {
campo = event.target;
valido = document.getElementById(’emailOK’);

emailRegex = /^[-\w.%+]{1,64}@(?:[A-Z0-9-]{1,63}\.){1,125}[A-Z]{2,63}$/i;
//Se muestra un texto a modo de ejemplo, luego va a ser un icono
if (emailRegex.test(campo.value)) {
valido.innerText = “válido”;
} else {
valido.innerText = “incorrecto”;
}
});

Email:

EjecutarEsconder resultadosAmpliar

Casos

Estoy usando el regex

/^[-\w.%+]{1,64}@(?:[A-Z0-9-]{1,63}\.){1,125}[A-Z]{2,63}$/i

Que funciona perfecto en casos como

abcde.fghi@gmail.com
nombre-apellido@do-mi-nio.info

Pero falla con acentos y otras letras latinas

germán@bla.com
yo@mi-compañía.com
estação@brasil.com.br

=================

  

 

En serio tenes direcciones e-mail con acentos? En tal caso, las clases (grupos entre corchetes) pueden incluir cosas como áéíóúÁÉÍÓÚäëïöüÄËÏÖÜàèìòùÀÈÌÒÙñÑ
– Luis Masuelli
el 1 dic. 15 a las 21:03

1

 

como [-\w.%+áéíóúÁÉÍÓÚäëïöüÄËÏÖÜàèìòùÀÈÌÒÙñÑ]
– Luis Masuelli
el 1 dic. 15 a las 21:04

  

 

Podes incluir también la ç pero no te la puse en el grupo porque no tengo un teclado acorde para buscarla.
– Luis Masuelli
el 1 dic. 15 a las 21:05

  

 

@LuisMasuelli Es cierto. Sin embargo, también me pregunto si no hay una solución más global que tener que buscar todos los posibles y agregarlos uno por uno.
– Mariano
el 1 dic. 15 a las 21:05

  

 

En Javascript no (en otros lenguajes como PHP y Python sí, pero es más jodido)
– Luis Masuelli
el 1 dic. 15 a las 21:07

=================

5 respuestas
5

=================

Con esta expresión regular puedes validar cualquier dirección de correo elecrónico que contenga caracteres Unicode:

/^(([^<>()[\]\.,;:\s@\”]+(\.[^<>()[\]\.,;:\s@\”]+)*)|(\”.+\”))@(([^<>()[\]\.,;:\s@\”]+\.)+[^<>()[\]\.,;:\s@\”]{2,})$/i

Si lo pruebas en una consola de JavaScript:

> emailRegex.test(“abcde.fghi@gmail.com”);
< true > emailRegex.test(“germán@bla.com”);
< true Fuente A partir de ahí, y como muy bien has mencionado, una expresión que se ajusta más a tus necesidades sería la siguiente: /^(?:[^<>()[\].,;:\s@”]+(\.[^<>()[\].,;:\s@”]+)*|”[^\n”]+”)@(?:[^<>()[\].,;:\s@”]+\.)+[^<>()[\]\.,;:\s@”]{2,63}$/i

1

 

Funciona perfecto! Validó todos los emails dentro del alcance que me interesa. A partir de tu respuesta, saqué los grupos que estaban de más y barras innecesarias. Por favor considerá la siguiente expresión /^(?:[^<>()[\].,;:\s@”]+(\.[^<>()[\].,;:\s@”]+)*|”[^\n”]+”)@‌​(?:[^<>()[\].,;:\s@”‌​]+\.)+[^<>()[\]\.,;:‌​\s@”]{2,63}$/i como alternativa basada en tu respuesta.
– Mariano
el 2 dic. 15 a las 2:22

  

 

He editado mi respuesta para incluir tu regex también 😉
– Hewbot
el 2 dic. 15 a las 5:37

Existen ciertas restricciones para emails pero puedo comentar que regularmente deben basarse en estas reglas:

Mayúsculas y minúsculas del alfabeto ingles.
Números de 0 al 9
puede contener punto pero no al inicio o repetirse.
puede usar los caracteres: !#$%&’*+-/=?^_`{|}~

Existen restricciones con ciertos tipos de email por ejemplo si contienen:

Alfabeto griego.
Caracteres cirílicos.
Caracteres japoneses.
Alfabeto latín con diacríticos.

ejemplos no aceptados como direcciones validas de email:

червь.ca®rton@picnic.com

josé.patroñinio@hotdog.com

Ver más :

https://en.wikipedia.org/wiki/Email_address
http://tools.ietf.org/html/rfc5322

Imagino un email con caracteres cirilicos, peor aún si lo que quieres es almacenar esos datos en una BD, que tipo de SQL collation utilizar!

Pero bueno la pregunta es como validar ese tipo de emails pues aquí tienes un script:

function validarEmail(valor) {
if (/^(([^<>()[\]\.,;:\s@\”]+(\.[^<>()[\]\.,;:\s@\”]+)*)|(\”.+\”))@(([^<>()[\]\.,;:\s@\”]+\.)+[^<>()[\]\.,;:\s@\”]{2,})$/i.test(valor)){
alert(“La dirección de email ” + valor + ” es correcta!.”);
} else {
alert(“La dirección de email es incorrecta!.”);
}
}

por ejemplo:

validarEmail(“jorgésys.boc+al@hotflow.com”);

El script te mostraría que la dirección email es correcta.

  

 

Gracias por el dato. Realmente me sirve. Si bien el alcance definido no debe cubrir todo el RFC, sino más bien los casos más genéricos, me interesa evaluarlo como opción: ¿Cómo se implementaría esto en JavaScript?
– Mariano
el 1 dic. 15 a las 21:23

  

 

Hola Mariano entiendo lo que comentas, yo no lo implementaría cree-me en producción podría darte muchos dolores de cabeza jeje, te agregue un script el cual puede validar lo que necesitas, saludos!
– Elenasys
el 1 dic. 15 a las 21:30

  

 

Es un punto totalmente válido… Creo que si pensás que no debería validarse, debería estar explícito en la respuesta. Este tipo de respuestas bien fundamentadas me sirve para definir el alcance.
– Mariano
el 1 dic. 15 a las 21:34

  

 

Ya es posible usar caracteres internacionales en nombres de dominio y direcciones de correo electrónico. Véase en.wikipedia.org/wiki/International_email
– Rubén
el 14 dic. 15 a las 13:07

He encontrado un artículo aquí (en Inglés) que habla de algunas declaraciones diferentes expresiones regulares que pueden verificar direcciones de correo electrónico basados en el estándar RFC. Hay muchas declaraciones de expresiones regulares recomendada diferentes y no hay un único todo-en-una solución. Pero esta expresión regular es probablemente el que me iría con, añadiendo caracteres acentuados a la lista de caracteres válidos también.

\A[a-z0-9!#$%&’*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&’*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\z

  

 

Y ¿Cómo sería una versión que funcione en JavaScript y que acepte acentos y demás caracteres latinos?
– Mariano
el 1 dic. 15 a las 21:36

Según la RFC 6531 se tendrían que soportar más caracteres de a los que estamos acostumbrados. Pero los servidores lo limitan con otras anteriores.
No veo una solución con un rango único que implique introducir «todos los caracteres latinos». A pesar de que parece que van juntos (como en esta tabla del 0080 al 00FF), hay otros por en medio.

Una posible regex para los caracteres latinos que podrían interesarte (fuente) y añadiendo la (sugerencia):

/[A-Za-z\u0021-\u007F\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff]+/g

Se podría juntar con tu regex, las que ya han indicado anteriormente o una según la RFC 2822, como esta, para que no excluya los rangos que te interesan (que hay muchos tipos de tildes) (fuente):

^([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22))*\x40([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d))*$

  

 

Buena respuesta. Sin duda sería ideal ajustarse a la RFC6531. Sin embargo, creo que no sería nada fácil implementarlo… En cuanto al primer regex, está dejando afuera varios caracteres del rango \u0021-\u007F (por ejemplo los símbolos _%+-)… En cuanto al segundo, deja afuera a los caracteres acentuados (como á = \u00E1 = \xc3\xa1).
– Mariano
el 2 dic. 15 a las 6:15

1

 

Estupendo. La primera regex que puse era para caracteres latinos, no los símbolos _%+- (la he editado para añadirlos). Respecto a la segunda ya advertí de que es según la RFC 2822, que se podía tomar de base para añadirle la primera o las de respuestas previas.
– dayer
el 2 dic. 15 a las 9:11

¿Cómo validar un email que acepte todos los caracteres latinos?

La única forma 100% segura de verificar si un email es valido es enviando uno. Si el usuario escribio el correo mal, ellos simplemente reintentaran.

Según RFC 5322, presidencia@gobierno.pais es un email “valido”, pero,
¿alguien lo va a recibir? ¿Existe un servidor detras del dominio que acepte correos? Esas son las preocupaciones que deberias tener. Lo que seas que estas haciendo, una lista de distribución, registro, etc. debe de enviar un correo de confirmación para validarlo. La implementacion dependera del stack que uses (C#, PHP, Java?) y hací tendrás correos validos que alguien recibe.

Puedes implementar algo en el lado del cliente que al menos diga “este es una direción de correo electronico”, pero no debería de ser tu herramienta de “validación”, solo trata de que el usuario se de cuenta de que lo que escribió es #($^%#$@^(#$^.com

  

 

Totalmente de acuerdo, la única forma de validar es desde el server. Y sí, la idea es que sea una primera etapa de validación genérica, pero sin depender sólo en esto (al fin y al cabo JavaScript podría estar deshabilitado). Muy correcta tu visión, y es la forma en que lo quiero implementar.
– Mariano
el 3 dic. 15 a las 3:51