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?
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:
- rfc5322
- rfc5321
- rfc3696
- rfc6531 (permet des caractères unicode, bien que de nombreux les clients / serveurs ne l'acceptent pas)
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."
vous pouvez utiliser filter_var pour cela.
<?php
function validateEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
?>
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;
}
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);
}
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:
- vérifiez que le symbole @ existe, et avant et après il y a des symboles non -@:
/^[^@]+@[^@]+$/
- Essayez d'envoyer un mail à cette adresse avec un "code d'activation".
- 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.
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é.
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 .
/(?![[: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