Tengo esta función para validar una dirección de correo electrónico:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
¿Está bien verificar si la dirección de correo electrónico es válida o no?
php
regex
email
email-validation
Cameron
fuente
fuente
validateEmail
sería correcto, así como pasar$email
, no$EMAIL
.Respuestas:
La forma más fácil y segura de verificar si una dirección de correo electrónico está bien formada es usar la
filter_var()
función:Además, puede verificar si el dominio define un
MX
registro:Pero esto todavía no garantiza que exista el correo. La única forma de averiguarlo es enviando un correo de confirmación.
Ahora que tiene una respuesta fácil, no dude en seguir leyendo sobre la validación de la dirección de correo electrónico si le interesa aprender o simplemente usar la respuesta rápida y seguir adelante. Sin resentimientos.
Intentar validar una dirección de correo electrónico utilizando una expresión regular es una tarea "imposible". Me atrevería a decir que esa expresión regular que has hecho es inútil. Hay tres rfc con respecto a las direcciones de correo electrónico y escribir una expresión regular para atrapar direcciones de correo electrónico incorrectas y al mismo tiempo no tener falsos positivos es algo que ningún mortal puede hacer. Consulte esta lista para ver las pruebas (fallidas y exitosas) de la expresión regular utilizada por PHP
filter_var()
función .Incluso las funciones PHP integradas, los clientes o servidores de correo electrónico no funcionan correctamente. Aún en la mayoría de los casos
filter_var
es la mejor opción.Si desea saber qué patrón de expresiones regulares utiliza PHP (actualmente) para validar las direcciones de correo electrónico, consulte la fuente de PHP .
Si desea obtener más información sobre las direcciones de correo electrónico, le sugiero que comience a leer las especificaciones, pero debo advertirle que no es una lectura fácil de ninguna manera:
Tenga en cuenta que
filter_var()
como ya se indicó, solo está disponible a partir de PHP 5.2. En caso de que desee que funcione con versiones anteriores de PHP, puede usar la expresión regular utilizada en PHP:PD Una nota sobre el patrón regex utilizado anteriormente (de la fuente PHP). Parece que hay algunos derechos de autor sobre él de Michael Rushton . Como se indicó: "Siéntase libre de usar y redistribuir este código. Pero conserve este aviso de copyright".
fuente
filter_var
se retrasarán bastante tiempo, incluso si lo cambian en este momento (he publicado un informe de error).Puede usar filter_var para esto.
fuente
En mi experiencia, las
regex
soluciones tienen demasiados falsos positivos y lasfilter_var()
soluciones tienen falsos negativos (especialmente con todos los TLD más nuevos ).En cambio, es mejor asegurarse de que la dirección tenga todas las partes requeridas de una dirección de correo electrónico (usuario, símbolo "@" y dominio), luego verifique que el dominio en sí existe.
No hay forma de determinar (del lado del servidor) si existe un usuario de correo electrónico para un dominio externo.
Este es un método que creé en una clase de utilidad:
fuente
stristr
no podrá obtener el dominio si hay múltiples signos @. Mejorexplode('@',$email)
y verifique esosizeof($array)==2
checkdnsrr()
devolvería falso si hubiera un signo @ en el dominio.Creo que podría ser mejor usar los filtros incorporados de PHP, en este caso particular:
Puede devolver un verdadero o falso cuando se le proporciona el
FILTER_VALIDATE_EMAIL
parámetro.fuente
Esto no solo validará su correo electrónico, sino que también lo desinfectará para caracteres inesperados:
fuente
Respondí esto en la 'pregunta principal' sobre la verificación de correos electrónicos https://stackoverflow.com/a/41129750/1848217
Por lo tanto, simplemente marque @, insinúe al usuario en la interfaz y envíe correos electrónicos de verificación en la dirección dada.
fuente
@
, pero en realidad no verifica que sea válida según ninguno de los RFC que rigen el correo electrónico. Tampoco funciona como está escrito. Lo ejecuté a través de regex101.com y no pudo coincidir con direcciones válidas/^[^@]+@[^@+]$/
a/^[^@]+@[^@]+$/
filter_var
método? Tampoco soluciona el problema de aceptar direcciones mal formateadas. Su expresión regular lo aceptará felizmentejoe@domain
como una dirección de correo electrónico válida, cuando no lo esfilter_var($email, FILTER_VALIDATE_EMAIL, $newOptions)
. Pero tiene una función antigua en el servidor, no puede actualizar en algunos casos. Y perderá clientes con algunos nuevos correos electrónicos válidos. Además, una vez más me doy cuenta de que no todos los servidores de correo electrónico funcionan estrictamente de acuerdo con el estándar común y moderno de direcciones de correo electrónico.Si desea verificar si el dominio proporcionado desde la dirección de correo electrónico es válido, use algo como:
Esta es una forma práctica de filtrar muchas direcciones de correo electrónico no válidas, junto con la validación de correo electrónico estándar, porque el formato de correo electrónico válido no significa correo electrónico válido .
Tenga en cuenta que la función
idn_to_ascii()
(o su función hermanaidn_to_utf8()
) puede no estar disponible en su instalación de PHP, requiere extensiones PECL intl> = 1.0.2 y PECL idn> = 0.1.También tenga en cuenta que IPv4 o IPv6 como parte del dominio en el correo electrónico (por ejemplo
user@[IPv6:2001:db8::1]
) no se pueden validar, solo los hosts con nombre pueden hacerlo .Ver más aquí .
fuente
Después de leer las respuestas aquí, esto es con lo que terminé:
fuente
Si sólo está buscando una expresión regular real que permite varios puntos, guiones y guiones, como sigue:
[a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+
. Eso permitirátom_anderson.1-neo@my-mail_matrix.com
validar un correo electrónico de aspecto bastante estúpido .fuente
Hoy en día, si usa un formulario HTML5,
type=email
entonces ya está un 80% seguro ya que los motores de navegador tienen su propio validador. Para complementarlo, agregue esta expresión regular a supreg_match_all()
y niegue:Encuentre la expresión regular utilizada por los formularios HTML5 para la validación
https://regex101.com/r/mPEKmy/1
fuente