Comment valider une adresse e-mail en PHP

j'ai cette fonction pour valider une adresse email:

function validateEMAIL($EMAIL) {
    $v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";

    return (bool)preg_match($v, $EMAIL);
}

est-ce correct pour vérifier si l'adresse email est valide ou non?

173
demandé sur hakre 2012-08-19 17:29:34

9 réponses

la façon la plus simple et la plus sûre de vérifier si une adresse courriel est bien formée est d'utiliser la fonction filter_var() :

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // invalid emailaddress
}

en outre, vous pouvez vérifier si le domaine définit un MX enregistrement:

if (!checkdnsrr($domain, 'MX')) {
    // domain is not valid
}

mais cela ne garantit toujours pas que le courrier existe. Le seul moyen de le savoir est d'envoyer un courrier de confirmation.


Maintenant que vous avez votre réponse facile n'hésitez pas à lire au sujet de la validation de l'adresse e-mail si vous tenez à apprendre ou autrement utiliser la réponse rapide et passer à autre chose. Sans rancune.

essayer de valider une adresse email en utilisant un regex est une tâche "impossible". J'irais jusqu'à dire que cette regex vous avez fait est inutile. Il ya trois rfc concernant emailadresses et l'écriture d'un regex pour attraper les mauvaises emailadresses et en même temps ne pas avoir de faux positifs est quelque chose qu'aucun mortel ne peut le faire. Vérifier cette liste pour les tests (à la fois échoué et réussi) du regex utilisé par la fonction filter_var() de PHP.

même les fonctions PHP intégrées, les clients de messagerie ou les serveurs ne le font pas correctement. Toujours dans la plupart des cas filter_var est la meilleure option.

si vous voulez savoir quel modèle regex PHP (actuellement) utilise pour valider les adresses email voir la source PHP .

si vous voulez en savoir plus sur les adresses e-mail, je vous suggère de commencer à lire les spécifications, mais je dois vous prévenir que ce n'est pas une lecture facile par n'importe quel étirement:

notez que filter_var() est comme déjà indiqué Disponible en PHP 5.2. Dans le cas où vous voulez qu'il fonctionne avec des versions plus anciennes de PHP, vous pouvez utiliser le regex utilisé dans PHP:

<?php

$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';

$emailaddress = 'test@gmail.com';

if (preg_match($pattern, $emailaddress) === 1) {
    // emailaddress is valid
}

P. S. Une note sur l'expression régulière pattern utilisé ci-dessus (à partir de la source en PHP). Il semble qu'il y ait des droits d'auteur sur Michael Rushton . Comme indiqué: "N'hésitez pas à utiliser et redistribuez ce code. Mais s'il vous plaît gardez cette notice de copyright."

465
répondu PeeHaa 2018-05-24 14:33:51

vous pouvez utiliser filter_var pour cela.

<?php
   function validateEmail($email) {
      return filter_var($email, FILTER_VALIDATE_EMAIL);
   }
?>
32
répondu Cameron Martin 2015-04-22 07:26:07

D'après mon expérience, regex les solutions ont trop de faux positifs et filter_var() les solutions ont des faux négatifs (surtout avec tous les nouveaux TLDs ).

au lieu de cela, il est préférable de s'assurer que l'adresse a toutes les parties requises d'une adresse e-mail (utilisateur, symbole"@", et domaine), puis vérifier que le domaine lui-même existe.

il n'y a aucun moyen de déterminer (côté serveur) si un utilisateur de messagerie existe pour un domaine externe.

c'est une méthode que j'ai créée dans une classe D'utilité:

public static function validateEmail($email)
{
    // SET INITIAL RETURN VARIABLES

        $emailIsValid = FALSE;

    // MAKE SURE AN EMPTY STRING WASN'T PASSED

        if (!empty($email))
        {
            // GET EMAIL PARTS

                $domain = ltrim(stristr($email, '@'), '@') . '.';
                $user   = stristr($email, '@', TRUE);

            // VALIDATE EMAIL ADDRESS

                if
                (
                    !empty($user) &&
                    !empty($domain) &&
                    checkdnsrr($domain)
                )
                {$emailIsValid = TRUE;}
        }

    // RETURN RESULT

        return $emailIsValid;
}
10
répondu Jabari 2018-02-09 18:26:36

je pense que vous pourriez être mieux à l'aide de PHP inbuilt filtres - dans ce cas particulier:

il peut retourner un vrai ou faux lorsqu'il est fourni avec le FILTER_VALIDATE_EMAIL param.

8
répondu Fluffeh 2012-08-19 13:32:43

cela permettra non seulement de valider votre courriel, mais aussi de le nettoyer pour les caractères inattendus:

$email  = $_POST['email'];
$emailB = filter_var($email, FILTER_SANITIZE_EMAIL);

if (filter_var($emailB, FILTER_VALIDATE_EMAIL) === false ||
    $emailB != $email
) {
    echo "This email adress isn't valid!";
    exit(0);
}
7
répondu Excalibur 2017-03-23 07:51:45

a répondu à cette question dans 'top question' sur la vérification des e-mails https://stackoverflow.com/a/41129750/1848217

pour moi, la bonne façon de vérifier les e-mails est:

  1. vérifiez que le symbole @ existe, et avant et après il y a des symboles non -@: /^[^@]+@[^@]+$/
  2. Essayez d'envoyer un mail à cette adresse avec un "code d'activation".
  3. Lorsque l'utilisateur "Active" son adresse e-mail, nous verrons que tout va bien.

bien sûr, vous pouvez afficher un avertissement ou tooltip en début de page lorsque l'utilisateur tapé "étrange" e-mail de l'aider à éviter les erreurs courantes, comme aucun point dans la partie de domaine ou des espaces dans le nom sans citer et ainsi de suite. Mais vous devez accepter l'adresse "bonjour@monde" si l'utilisateur le voulez vraiment.

aussi, vous devez vous rappeler que l'adresse e-mail standard était et peut evolute, donc vous ne pouvez pas juste taper quelques regexp "standard-valid" une fois et pour tous les temps. Et vous devez vous rappeler que certains béton internet les serveurs peuvent échouer certains détails de la norme commune et, en fait, travailler avec propre "norme modifiée".

donc, il suffit de vérifier@, l'utilisateur d'indication sur frontend et envoyer des e-mails de vérification sur l'adresse donnée.

2
répondu FlameStorm 2017-05-23 12:02:59

si vous êtes à la recherche d'un regex réel qui permet différents points, underscores et tirets, il est comme suit: [a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+ . Cela permettra à un email assez stupide comme tom_anderson.1-neo@my-mail_matrix.com d'être validé.

0
répondu smulholland2 2016-12-28 18:19:47

si vous voulez vérifier si domaine fourni à partir de l'adresse email est valide, utilisez quelque chose comme:

/*
* Check for valid MX record for given email domain
*/
if(!function_exists('check_email_domain')){
    function check_email_domain($email) {
        //Get host name from email and check if it is valid
        $email_host = explode("@", $email);     
        //Add a dot to the end of the host name to make a fully qualified domain name and get last array element because an escaped @ is allowed in the local part (RFC 5322)
        $host = end($email_host) . "."; 
        //Convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
        return checkdnsrr(idn_to_ascii($host), "MX"); //(bool)       
    }
}

c'est un moyen pratique de filtrer un grand nombre d'adresses e-mail invalides, ainsi que la validation d'e-mail standart, car valide format e-mail ne signifie pas valide e-mail .

noter que idn_to_ascii() (ou sa fonction sœur idn_to_utf8() ) fonction ne peut pas être disponible dans votre installation PHP, il nécessite des extensions PECL intl >= 1.0.2 et PECL idn >= 0.1.

gardez également à l'esprit que IPv4 ou IPv6 en tant que partie du domaine dans le courriel (par exemple user@[IPv6:2001:db8::1] ) ne peut pas être validé, seulement nommé hôtes peuvent.

voir plus ici .

0
répondu bodi0 2018-05-02 09:49:07
/(?![[:alnum:]]|@|-|_|\.)./

de nos jours, si vous utilisez un formulaire HTML5 avec type=email alors vous êtes déjà à 80% en sécurité puisque les moteurs de navigateur ont leur propre validateur. Pour le compléter, ajoutez ce regex à votre preg_match_all() et annulez-le:

if (!preg_match_all("/(?![[:alnum:]]|@|-|_|\.)./",$email)) { .. }

trouver le regex utilisé par les formulaires HTML5 pour la validation

https://regex101.com/r/mPEKmy/1

-1
répondu Thielicious 2017-08-14 12:32:09