Comment valider un Email en PHP?

Comment puis-je valider la valeur d'entrée est une adresse email valide en 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 dépréciée. Comment puis-je résoudre ce problème. S'il vous plaît aider moi.

106
demandé sur hakre 2011-05-02 14:02:04

5 réponses

vous pouvez utiliser la fonction filter_var() , qui vous donne beaucoup d'options pratiques de validation et d'assainissement.

filter_var($email, FILTER_VALIDATE_EMAIL)

si vous ne voulez pas changer votre code qui dépend de votre fonction, faites:

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

Note : pour D'autres utilisations (lorsque vous avez besoin de Regex), la famille de fonctions ereg dépréciée (fonctions de Regex POSIX) doit être remplacée par la famille preg ( fonctions de Regex PCRE ). Il ya une petite quantité de différences, la lecture du manuel devrait suffire.

mise à jour 1 : comme souligné par @binaryLV :

PHP 5.3.3 et 5.2.14 avait un bug lié à FILTER_VALIDATE_EMAIL, qui a conduit à segfault lors de la validation grandes valeurs. La solution Simple et sûre pour cela est d'utiliser strlen() avant de filter_var() . Je ne suis pas sûr de 5.3.4 finale, mais il est écrit que certaines versions de 5.3.4-snapshot ont aussi été affectées.

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

Maj 2 : cette méthode validera bien sûr bazmega@kapa comme adresse e-mail valide, car il s'agit en fait d'une adresse e-mail valide. Mais la plupart du temps sur Internet, vous voulez aussi que l'adresse e-mail ait un TLD: bazmega@kapa.com . Comme suggéré dans ce post de blog (lien posté par @Istiaque Ahmed ), vous pouvez augmenter filter_var() avec un regex qui vérifiera l'existence d'un point dans la partie domaine (ne vérifiera pas valide TLD):

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

comme @Eliseo Ocampos fait remarquer, ce problème n'existe qu'avant PHP 5.3, dans cette version ils ont changé le regex et maintenant il fait cette vérification, donc vous n'avez pas à.

254
répondu kapa 2017-05-23 12:10:26

voir les notes à http://www.php.net/manual/en/function.ereg.php :

Note:

à partir de PHP 5.3.0, l'extension regex est dépréciée en faveur de le PCRE "extension de 151940920" . L'appel de cette la fonction émettra un E_DEPRECATED avis. Voir la liste des différences pour l'aide sur la conversion à PCRE.

Note:

preg_match() , qui utilise une expression régulière compatible Perl la syntaxe est souvent une alternative plus rapide pour ereg().

9
répondu Sean Kelleher 2011-05-02 10:10:37

C'est ancien poste mais je vais partager une ma solution parce que personne ne mentionne ici un problème avant.

nouvelle adresse e-mail peut contenir des caractères UTF-8 ou des noms de domaine spéciaux comme .live , .news , etc.

aussi je trouve qu'une adresse e-mail peut être sur Cyrilic et sur tous les cas standard regex ou filter_var() échouera.

C'est pourquoi j'ai fait une solution pour elle:

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.

4
répondu Ivijan Stefan Stipić 2017-10-16 18:27:15

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
répondu unbreak 2016-02-12 10:12:25

Restez à l'écart des solutions regex et filter_var() pour valider le courriel. Voir la réponse: https://stackoverflow.com/a/42037557/953833

1
répondu Jabari 2017-05-23 12:26:21