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 de vérifier si l'adresse e-mail est valide ou non?
php
regex
email
email-validation
Cameron
la source
la source
validateEmail
serait corret, ainsi que passant$email
, non$EMAIL
.Réponses:
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:De plus, vous pouvez vérifier si le domaine définit un
MX
enregistrement: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: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."
la source
filter_var
seront à la traîne d'un certain temps, même s'ils les modifient actuellement (j'ai publié un rapport de bogue).Vous pouvez utiliser filter_var pour cela.
la source
D'après mon expérience, les
regex
solutions ont trop de faux positifs et lesfilter_var()
solutions ont de faux négatifs (en particulier avec tous les nouveaux TLD ).Au lieu de cela, il est préférable de s'assurer que l'adresse contient toutes les parties requises d'une adresse e-mail (utilisateur, symbole "@" et domaine), puis vérifiez 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.
Il s'agit d'une méthode que j'ai créée dans une classe Utility:
la source
stristr
échouera à obtenir le domaine s'il y a plusieurs signes @. Mieux vautexplode('@',$email)
et vérifier celasizeof($array)==2
checkdnsrr()
s'il y avait un signe @ dans le domaine.Je pense que vous feriez mieux d'utiliser les filtres intégrés de PHP - dans ce cas particulier:
Il peut retourner un vrai ou un faux lorsqu'il est fourni avec le
FILTER_VALIDATE_EMAIL
paramètre.la source
Cela permettra non seulement de valider votre e-mail, mais aussi de le nettoyer pour les caractères inattendus:
la source
A répondu à cette question dans la «question principale» sur la vérification des e-mails https://stackoverflow.com/a/41129750/1848217
Donc, il suffit de cocher @, d'indiquer l'utilisateur sur le frontend et d'envoyer des e-mails de vérification à une adresse donnée.
la source
@
, mais elle ne vérifie pas vraiment qu'elle est valide par aucun des RFC qui régissent le courrier électronique. Cela ne fonctionne pas non plus comme écrit. Je l'ai exécuté via regex101.com et il n'a pas réussi à faire correspondre les adresses valides/^[^@]+@[^@+]$/
à/^[^@]+@[^@]+$/
filter_var
méthode? Cela ne résout pas non plus le problème d'accepter des adresses mal formatées. Votre expression régulière acceptera volontiersjoe@domain
comme adresse e-mail valide, quand ce n'est pas le casfilter_var($email, FILTER_VALIDATE_EMAIL, $newOptions)
. Mais vous avez une ancienne fonction sur le serveur, vous ne pouvez pas mettre à jour dans certains cas. Et vous perdrez des clients avec de nouveaux e-mails valides. De plus, une fois de plus, je remarque que tous les serveurs de messagerie ne fonctionnent pas strictement en fonction du standard commun et moderne des adresses e-mail.Si vous souhaitez vérifier si le domaine fourni à partir de l'adresse e-mail est valide, utilisez quelque chose comme:
C'est un moyen pratique de filtrer un grand nombre d'adresses e-mail non valides, ainsi qu'une validation standard des e-mails, car un format d'e-mail valide ne signifie pas un e-mail valide .
Notez que la fonction
idn_to_ascii()
(ou sa fonction sœuridn_to_utf8()
) peut ne pas être disponible dans votre installation PHP, elle nécessite les extensions PECL intl> = 1.0.2 et PECL idn> = 0.1.Gardez également à l'esprit que IPv4 ou IPv6 en tant que partie de domaine dans le courrier électronique (par exemple
user@[IPv6:2001:db8::1]
) ne peut pas être validé, seuls les hôtes nommés le peuvent.Voir plus ici .
la source
Après avoir lu les réponses ici, voici ce que je me suis retrouvé avec:
la source
Si vous êtes à la recherche d'un regex qui permet de divers points, tirets et underscores, il suit que:
[a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+
. Cela permettra detom_anderson.1-neo@my-mail_matrix.com
valider un e-mail d'aspect assez stupide .la source
De nos jours, si vous utilisez un formulaire HTML5 avec,
type=email
vous êtes déjà à 80% en sécurité car les moteurs de navigateur ont leur propre validateur. Pour le compléter, ajoutez cette expression régulière à votrepreg_match_all()
et annulez-la:Trouvez l'expression régulière utilisée par les formulaires HTML5 pour la validation
https://regex101.com/r/mPEKmy/1
la source