La façon la plus simple et la plus sûre de vérifier si une adresse e-mail est bien formée est d'utiliser la filter_var()
fonction:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// invalid emailaddress
}
De plus, 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. La seule façon de le savoir est d'envoyer un e-mail de confirmation.
Maintenant que vous avez votre réponse facile, n'hésitez pas à lire sur la validation des adresses e-mail si vous souhaitez apprendre ou utiliser simplement la réponse rapide et continuer. Pas d'émotions fortes.
Tenter de valider une adresse e-mail à l'aide d'une expression régulière est une tâche «impossible». J'irais jusqu'à dire que ce regex que vous avez fait est inutile. Il y a trois RFC concernant les adresses e-mail et l'écriture d'une expression rationnelle pour attraper les adresses e-mail erronées et en même temps, ne pas avoir de faux positifs, c'est quelque chose qu'aucun mortel ne peut faire. Consultez cette liste pour les tests (échoués et réussis) de l'expression rationnelle utilisée par la filter_var()
fonction PHP .
Même les fonctions PHP intégrées, les clients de messagerie ou les serveurs ne fonctionnent pas correctement. Dans la plupart des cas, filter_var
c'est toujours la meilleure option.
Si vous voulez savoir quel modèle d'expression régulière PHP (actuellement) utilise pour valider les adresses e-mail, consultez 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 avertir que ce n'est pas une lecture facile par tous les bouts:
Notez que cela filter_var()
n'est déjà indiqué que disponible à partir de PHP 5.2. Si vous voulez qu'il fonctionne avec des versions antérieures de PHP, vous pouvez utiliser l'expression régulière utilisée en 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
}
PS Une note sur le modèle d'expression régulière utilisé ci-dessus (à partir de la source PHP). Il semble qu'il y ait des droits d'auteur sur Michael Rushton . Comme indiqué: "N'hésitez pas à utiliser et à redistribuer ce code. Mais veuillez conserver cette notice de copyright."
validateEmail
serait corret, ainsi que passant$email
, non$EMAIL
.