2009-04-12 16 views
57

Cuando los usuarios crean una cuenta en mi sitio, quiero hacer que la validación del servidor para correos electrónicos no acepte cada entrada.¿Cuál es la expresión regular más simple para validar correos electrónicos para no aceptarlos a ciegas?

Enviaré una confirmación, de manera de hacer un handshake validation.

Busco algo simple, no el mejor, pero no demasiado simple que no valida nada. No sé dónde debe estar la limitación, ya que cualquier expresión regular no hará la validación correcta porque no es posible hacerlo con expresiones regulares.

Estoy tratando de limitar la sintaxis y la complejidad visual inherente a las expresiones regulares, porque en este caso cualquiera será correcto.

¿Qué expresiones regulares puedo usar para hacer eso?

+0

Pensamiento "más simple" era exactamente tan subjetivo como "mejor", ceteris paribus, y ese hilo tenía una cornucopia de expresiones regulares, pero si crees que ... * encoge de hombros * –

+0

Si haces una validación de expresiones regulares por qué limitar la expresión a algo simple? Usemos algo bueno, esto no tendrá ningún impacto en su código que proporcione mejores resultados. – twk

Respuesta

69
+1

Esto coincidirá con direcciones no válidas. Cualquier regex lo hará, pero este coincidirá con ortografías erróneas comunes como test @ stackoverflow..com (tenga en cuenta los puntos dobles). Proporcione un mejor ejemplo. –

+40

Se supone que es un filtro muy simple y muy difícil, y no veo por qué los períodos duplicados tienen privilegios sobre todos los otros errores con costos de complejidad similares para cubrirlos. – chaos

+1

+1. Esta es una pregunta subjetiva de todos modos, y esto es simple. –

172

Es posible escribir una expresión regular que sólo aceptan direcciones de correo electrónico que siguen las normas. Sin embargo, hay algunas direcciones de correo electrónico que no siguen estrictamente los estándares, pero aún funcionan.

Estas son algunas de las expresiones regulares simples para la validación básica:

contiene un carácter @:

@ 

Contiene @ y un punto en algún lugar después de que:

@.*?\. 

tiene al menos una carácter antes del @, antes del período y después de él:

[email protected]+\..+ 

tiene sólo un @, al menos un carácter antes de la @ antes del período y después de ella:

^[^@][email protected][^@]+\.[^@]+$ 

usuario AmoebaMan17 sugiere esta modificación para eliminar los espacios en blanco:

^[^@\s][email protected][^@\s]+\.[^@\s]+$ 
+4

Hmm ... ¿Por qué el voto a favor? Si no especifica una razón, no tiene sentido ... – Guffa

+1

+1 para los ejemplos simples – Lijo

+0

+1 - ¡Excelente respuesta! –

2

Take your pick.

Aquí está el que cumple con RFC 2822 Section 3.4.1 ...

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) 

Solo en caso de tener curiosidad. :)

+5

Solo una nota para cualquiera que vea esto ahora: que no cumple con RFC 2822. – porges

+9

Y tampoco es simple :) –

+2

También bloqueará un host de direcciones de correo electrónico válidas. Especialmente los que usan caracteres/idiomas internacionales. –

-3

"^ \ w [^ @] * @ \ w [^ @.] +. \ W [^.] {2,4} $". No permite más de un @ o período, funciona muy bien hasta ahora.

Además, para probar diferentes expresiones regulares, descargue Expresso desde http://www.ultrapico.com/. Realmente me ayudó.

+1

Eso no funcionará para dominios de países que no sean de los EE. UU. (Por ejemplo, [email protected]) Simple es bueno, pero probablemente debería estar del lado de la inclusión. – swilliams

1

^[a-zA-Z0-9 _. + -] + @ [a-zA-Z0-9 -] +. [A-zA-Z0-9-.] + $

  • Sólo 1 @
  • varios dominios y subdominios
3

Creo que este pequeño arreglo a la expresión por AmoebaMan17 debe dejar la dirección de inicio/la que termina con un punto y también dejar de múltiples puntos uno al lado del otro. Tratando de no volver a complicarlo al tiempo que se elimina un problema común.

(?!.*\.\.)(^[^\.][^@\s][email protected][^@\s]+\.[^@\s\.]+$) 

Parece estar funcionando (pero yo no soy RegEx-PERT). Soluciona mi problema con los usuarios que copian & pegando las direcciones de correo electrónico desde el final de las oraciones que terminan con un punto.

i.e: Esta es mi nueva dirección de correo electrónico [email protected]

+0

Esto no funciona para un solo personaje antes del @ –

Cuestiones relacionadas