web-dev-qa-db-fra.com

Comment valider un email en PHP?

Comment puis-je valider la valeur d'entrée est une adresse e-mail valide utilisant php5. Maintenant j'utilise ce code

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; 
     }    
} 

mais il montre une erreur obsolète. Comment puis-je résoudre ce problème. Aidez-moi, s'il vous plaît.

116
learner

Vous pouvez utiliser la fonction filter_var(), qui vous offre de nombreuses options pratiques de validation et de désinfection.

filter_var($email, FILTER_VALIDATE_EMAIL)

Si vous ne voulez pas changer le code qui s'appuie sur votre fonction, faites simplement:

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

Remarque : Pour les autres utilisations (où vous avez besoin de Regex), la famille de fonctions obsolète ereg (Fonctions POSIX Regex) doit être remplacée par la preg famille ( fonctions PCRE Regex ). Il y a un peu de différences, la lecture du manuel devrait suffire.

Mise à jour 1 : Comme indiqué par @ binaryLV :

PHP 5.3.3 et 5.2.14 avaient un bug lié à FILTER_VALIDATE_EMAIL, ce qui entraînait un segfault lors de la validation de grandes valeurs. La solution de contournement simple et sûre consiste à utiliser strlen() avant filter_var(). Je ne suis pas sûr de la version 5.3.4 finale, mais il est écrit que certaines versions d’images instantanées 5.3.4 ont également été affectées.

Ce bug a déjà été corrigé.

Update 2 : Cette méthode validera bien sûr bazmega@kapa en tant qu'adresse e-mail valide car il s'agit en fait d'une adresse e-mail valide. Mais la plupart du temps sur Internet, vous souhaitez également que l'adresse e-mail ait un TLD: [email protected]. Comme suggéré dans ce article de blog (lien posté par @ Istiaque Ahmed ), vous pouvez augmenter filter_var() avec une regex qui vérifie l'existence d'un point dans la partie de domaine (ne vérifiera pas si un valide TLD):

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

Comme @ Eliseo Ocampos a souligné, ce problème n'existe qu'avant PHP 5.3, dans cette version, ils ont changé la regex et maintenant, il vérifie tu n'as pas à.

266
kapa

Voir les notes sur http://www.php.net/manual/en/function.ereg.php :

Note:

A partir de PHP 5.3.0, l'extension regex est déconseillée au profit de extension PCRE . L'appel de cette fonction émettra un avis E_DEPRECATED. Voir la liste des différences pour obtenir de l'aide sur la conversion en PCRE.

Note:

preg_match () , qui utilise une syntaxe d'expression régulière compatible Perl, constitue souvent une alternative plus rapide à ereg ().

9
Sean Kelleher

Ceci est un ancien post mais je vais partager une de mes solutions car personne ne mentionne ici un problème auparavant.

La nouvelle adresse électronique peut contenir des caractères UTF-8 ou des noms de domaines spéciaux tels que .live, .news etc.

De plus, je trouve que certaines adresses électroniques peuvent être sur Cyrilic et que dans tous les cas, les expressions rationnelles standard ou filter_var() vont échouer.

C'est pourquoi j'ai créé une solution pour cela:

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;
        }
    }
}

Cette fonction fonctionne parfaitement pour tous les cas et formats de courrier électronique.

6

J'utilise toujours ceci:

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
unbreak

Utilisation:

var_dump(filter_var('[email protected]', FILTER_VALIDATE_EMAIL));
$validator = new EmailValidator();
$multipleValidations = new MultipleValidationWithAnd([
    new RFCValidation(),
    new DNSCheckValidation()
]);
$validator->isValid("[email protected]", $multipleValidations); //true
1
Roman

Éloignez-vous des solutions regex et filter_var() pour la validation des e-mails. Voir cette réponse: https://stackoverflow.com/a/42037557/9538

1
Jabari