validar validacion texto regular filter_validate_email expresion existe electronico correo como php regex validation email-validation

validacion - Cómo validar un correo electrónico en PHP?



validar email php mysql (5)

Esta es una publicación anterior, pero compartiré una solución porque nadie mencionó un problema antes.

La nueva dirección de correo electrónico puede contener caracteres UTF-8 o nombres de dominio especiales como .live , .news , etc.

También encuentro que algunas direcciones de correo electrónico pueden estar en Cyrilic y en todos los casos, las filter_var() regulares regex o filter_var() fallarán.

Es por eso que hice una solución para ello:

function valid_email($email) { if(is_array($email) || is_numeric($email) || is_bool($email) || is_float($email) || is_file($email) || is_dir($email) || is_int($email)) return false; else { $email=trim(strtolower($email)); if(filter_var($email, FILTER_VALIDATE_EMAIL)!==false) return $email; else { $pattern = ''/^(?!(?:(?://x22?//x5C[//x00-//x7E]//x22?)|(?://x22?[^//x5C//x22]//x22?)){255,})(?!(?:(?://x22?//x5C[//x00-//x7E]//x22?)|(?://x22?[^//x5C//x22]//x22?)){65,}@)(?:(?:[//x21//x23-//x27//x2A//x2B//x2D//x2F-//x39//x3D//x3F//x5E-//x7E]+)|(?://x22(?:[//x01-//x08//x0B//x0C//x0E-//x1F//x21//x23-//x5B//x5D-//x7F]|(?://x5C[//x00-//x7F]))*//x22))(?://.(?:(?:[//x21//x23-//x27//x2A//x2B//x2D//x2F-//x39//x3D//x3F//x5E-//x7E]+)|(?://x22(?:[//x01-//x08//x0B//x0C//x0E-//x1F//x21//x23-//x5B//x5D-//x7F]|(?://x5C[//x00-//x7F]))*//x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*//.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?://[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][://]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?://.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))//]))$/iD''; return (preg_match($pattern, $email) === 1) ? $email : false; } } }

Esta función funciona perfectamente para todos los casos y formatos de correo electrónico.

Cómo puedo validar el valor de entrada es una dirección de correo electrónico válida utilizando php5. Ahora estoy usando este código

function isValidEmail($email){ $pattern = "^[_a-z0-9-]+(/.[_a-z0-9-]+)*@[a-z0-9-]+(/.[a-z0-9-]+)*(/.[a-z]{2,3})$"; if (eregi($pattern, $email)){ return true; } else { return false; } }

pero muestra un error obsoleto. ¿Cómo puedo solucionar este problema? Por favor, ayúdame.


Manténgase alejado de las soluciones regex y filter_var() para validar el correo electrónico. Ver esta respuesta: https://.com/a/42037557/953833


Puede usar la función filter_var() , que le ofrece muchas opciones útiles de validación y sanitización.

filter_var($email, FILTER_VALIDATE_EMAIL)

Si no quiere cambiar su código que se basó en su función, solo haga lo siguiente:

function isValidEmail($email){ return filter_var($email, FILTER_VALIDATE_EMAIL) !== false; }

Nota : Para otros usos (donde necesite Regex), la familia de funciones ereg desuso ereg funciones de ereg regular de POSIX) debe ser reemplazada por la familia de preg ( funciones PCRE Regex ). Hay una pequeña cantidad de diferencias, leer el Manual debería ser suficiente.

Actualización 1 : Como lo señaló @binaryLV :

PHP 5.3.3 y 5.2.14 tenían un bug relacionado con FILTER_VALIDATE_EMAIL, que daba como resultado segfault al validar valores grandes. Una solución simple y segura para esto es usar strlen() antes de filter_var() . No estoy seguro acerca de 5.3.4 final, pero está escrito que algunas versiones 5.3.4-snapshot también se vieron afectadas.

Este error ya ha sido corregido.

Actualización 2 : Este método validará bazmega@kapa como una dirección de correo electrónico válida, porque de hecho es una dirección de correo electrónico válida. Pero la mayoría de las veces en Internet, también desea que la dirección de correo electrónico tenga un TLD: [email protected] . Como se sugiere en esta publicación de blog (enlace publicado por @Istiaque Ahmed ), puede aumentar filter_var() con una expresión regular que verificará la existencia de un punto en la parte del dominio (aunque no buscará un TLD válido ):

function isValidEmail($email) { return filter_var($email, FILTER_VALIDATE_EMAIL) && preg_match(''/@.+/./'', $email); }

Como señaló @Eliseo Ocampos , este problema solo existe antes de PHP 5.3, en esa versión cambiaron la expresión regular y ahora lo hace, por lo que no es necesario.


Vea las notas en http://www.php.net/manual/en/function.ereg.php :

Note:

A partir de PHP 5.3.0, la extensión de expresiones regulares está en desuso en favor de la PCRE . Llamar a esta función emitirá un aviso E_DEPRECATED. Consulte la lista de diferencias para obtener ayuda sobre la conversión a PCRE.

Note:

preg_match() , que usa una sintaxis de expresión regular compatible con Perl, es a menudo una alternativa más rápida a ereg ().


Yo siempre uso esto:

function validEmail($email){ // First, we check that there''s one @ symbol, and that the lengths are right if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) { // Email invalid because wrong number of characters in one section, or wrong number of @ symbols. return false; } // Split it into sections to make life easier $email_array = explode("@", $email); $local_array = explode(".", $email_array[0]); for ($i = 0; $i < sizeof($local_array); $i++) { if (!preg_match("/^(([A-Za-z0-9!#$%&''*+//=?^_`{|}~-][A-Za-z0-9!#$%&''*+//=?^_`{|}~/.-]{0,63})|(/"[^(//|/")]{0,62}/"))$/", $local_array[$i])) { return false; } } if (!preg_match("/^/[?[0-9/.]+/]?$/", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name $domain_array = explode(".", $email_array[1]); if (sizeof($domain_array) < 2) { return false; // Not enough parts to domain } for ($i = 0; $i < sizeof($domain_array); $i++) { if (!preg_match("/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$/", $domain_array[$i])) { return false; } } } return true; }