Como validar um e-mail em PHP?

Como posso validar o valor de entrada é um endereço de E-mail válido usando o php5. Agora estou 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; 
     }    
} 

mas mostra um erro desactualizado. Como posso resolver este problema? Por favor, ajuda-me.

Author: hakre, 2011-05-02

5 answers

Você pode usar a função filter_var(), que lhe dá um monte de opções de validação e desinfecção úteis.

filter_var($email, FILTER_VALIDATE_EMAIL)

Se você não quer alterar o seu código que dependia da sua função, basta fazer:

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

Nota : para outros usos (onde necessita de Regex), a família de funções depreciadas ereg (funções POSIX Regex) deve ser substituído pela família preg [PCRE Regex Functions ]. Há uma pequena quantidade de diferenças, ler o Manual deve ser suficiente.

Actualizar 1 : como indicado por @binaryLV:

PHP 5.3.3 e 5.2.14 tinham um bug relacionado com FILTER_VALIDATE_ email, o que resultou em segfault ao validar grandes valores. Uma solução simples e segura para isto é usar strlen() antes de filter_var(). Não estou certo sobre 5.3.4 final, mas é escrito que algumas versões 5.3.4-instantâneas Também foram afetadas.

Este erro já foi corrigido.

Update 2 : este método irá obviamente validar bazmega@kapa como um endereço de E-mail válido, porque de facto é um endereço de E-mail válido. Mas na maioria das vezes na Internet, você também quer que o endereço de E-mail tenha um TLD: [email protected]. Como sugerido neste post blog (link publicado por @Istiaque Ahmed ), Você pode aumentar filter_var() com um regex que irá verificar para o existência de um ponto na parte do domínio (não irá verificar se existe um válido DLD embora):

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

Como @Eliseo Ocampos {[[18]} salientou, este problema só existe antes do PHP 5.3, nessa versão eles mudaram o regex e agora ele faz esta verificação, para que não tenha de o fazer.

 254
Author: kapa, 2017-05-23 12:10:26

Ver as notas em http://www.php.net/manual/en/function.ereg.php:

Note:

A partir de PHP 5.3.0, a extensão regex é depreciada a favor de a extensão PCRE . Chamando isto a função emitirá um E_DEPRECATED notar. Ver a lista de diferenças para ajuda na conversão para PCRE.

Note:

Preg_ Match () , que usa uma expressão regular compatível com o Perl sintaxe, é muitas vezes uma alternativa mais rápida para ereg ().

 9
Author: Sean Kelleher, 2011-05-02 10:10:37

Este é o post antigo, mas eu vou compartilhar uma solução porque ninguém mencionou aqui um problema antes.

O novo endereço de E-mail pode conter caracteres UTF-8 ou nomes de domínio especiais como .live, .news etc.

Também acho que algum endereço de E-mail pode estar em Cyrilic e em todos os casos regex padrão ou filter_var() vai falhar.

Foi por isso que fiz uma solução para isso.
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 função funciona perfeitamente para todos os casos e formatos de E-mail.

 4
Author: Ivijan Stefan Stipić, 2017-10-16 18:27:15

Uso sempre isto:

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;
}
 3
Author: unbreak, 2016-02-12 10:12:25

Fique longe de regex e filter_var() soluções para validar e-mail. Veja esta resposta: https://stackoverflow.com/a/42037557/953833

 1
Author: Jabari, 2017-05-23 12:26:21