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)
Disponible en PHP> = 5.2.0
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 defilter_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;
}