Validar un email en JavaScript que acepte todos los caracteres latinos

publicado por: Anonymous

Pregunta

¿Cómo validar un e-mail 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

_x000D_

_x000D_

document.getElementById('email').addEventListener('input', function() {_x000D_
    campo = event.target;_x000D_
    valido = document.getElementById('emailOK');_x000D_
        _x000D_
    emailRegex = /^[-w.%+]{1,64}@(?:[A-Z0-9-]{1,63}.){1,125}[A-Z]{2,63}$/i;_x000D_
    //Se muestra un texto a modo de ejemplo, luego va a ser un icono_x000D_
    if (emailRegex.test(campo.value)) {_x000D_
      valido.innerText = "válido";_x000D_
    } else {_x000D_
      valido.innerText = "incorrecto";_x000D_
    }_x000D_
});

_x000D_

<p>_x000D_
    Email:_x000D_
    <input id="email">_x000D_
    <span id="emailOK"></span>_x000D_
</p>

_x000D_

_x000D_

_x000D_

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

[email protected]
[email protected]

Pero falla con acentos y otras letras latinas

germá[email protected]
[email protected]ñía.com
estaçã[email protected]

solución

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

/^(([^<>()[].,;:[email protected]"]+(.[^<>()[].,;:[email protected]"]+)*)|(".+"))@(([^<>()[].,;:[email protected]"]+.)+[^<>()[].,;:[email protected]"]{2,})$/i

Si lo pruebas en una consola de JavaScript:

> emailRegex.test("[email protected]");
< true
> emailRegex.test("germá[email protected]");
< 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:

/^(?:[^<>()[].,;:[email protected]"]+(.[^<>()[].,;:[email protected]"]+)*|"[^n"]+")@(?:[^<>()[].,;:[email protected]"]+.)+[^<>()[].,;:[email protected]"]{2,63}$/i
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *