Noter:
5/5 (4)
Ajouté/Modifié le 2023-10-28
Visionné 7821 fois
Vérifier une adresse mail en PHP
Description
Ce script est un outil essentiel pour maintenir la qualité et la fiabilité des données collectées au sein de votre application web.
Son utilité se manifeste fréquemment lors de la conception de
formulaires de contact ou de la mise en place de
systèmes d'inscription de membres en PHP. La vérification de la validité d'une adresse e-mail revêt une grande importance, car elle permet de s'assurer que l'utilisateur a correctement renseigné ce champ du formulaire. Un e-mail valide est essentiel pour établir une communication efficace et s'assurer que les informations sont correctement acheminées vers les destinataires. En somme, ce script, bien que considéré comme relativement simple pour ceux ayant une certaine familiarité avec les expressions régulières, joue un rôle essentiel dans le processus de validation des adresses e-mail.
Petite parenthèseJe vous mets un site sympa pour valider/tester les expressions régulière en PHP, site pratique à garder sous le coude !
regex101https://regex101.com/
Explications:
Intéressons-nous a
preg_match (regex - regular expressions)
preg_match("#^[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?@[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}$#i",$chaine);
le ^ du début permet de vérifier que la chaine commence par ce qu'on demande ensuite, soit: [a-z0-9_-], ce qui veut dire que le début de l'adresse mail peut commencer par des lettres minuscules et/ou majuscules (Option de recherche: i qui permet de rechercher des caractères minuscules ou majuscules) avec des chiffres, un underscore et/ou un tiret.
Au cas où le mail serait constitué d'un ou plusieurs points (ex: mon.super@e.mail.com), on inspecte avec ? (point d’interrogation) (veut dire: "peut être répété et peut ne pas y être aussi") ceux qu'il y a entre parenthèses :
((\.[a-z0-9_-]+){1,})?
En gros cela veut dire : ".duTexteEtDesChiffresAvec_et-" qui peut se répéter à l'infini grâce à {1,} qui veut dire "1 fois ou plus".
Ensuite on vérifie s'il y a la fameuse
arobase @
on revérifie si la continuité du mail contient là encore des chiffres et/ou des lettres et/ou un tiret et/ou un underscore (avec
[a-z0-9_-]), vous remarquerez la présence d'un signe + (plus) après notre classe
[a-z0-9_-], cela signifie qu'il faut au moins 1 caractère ou plusieurs, par exemple:
a@a.aa fonctionnera mais
@a.aa ne fonctionnera pas.
Ensuite, nous avons un anti-slash suivi d'un point:
., cela signifie que nous voulons un point (.), il faut l'échapper avec un \ car le point est un métacaractères et sans le \ il veut dire "tous les caractères".
Et pour finir, la dernière classe
[a-z] suivie de
{2,} qui permet de vérifier la présence d'une chaine de lettres d'une longueur minimum de 2 à 30 (Cette partie sera l'extension du nom de domaine de l'adresse mail, par exemple: fr, com, net, xyz...).
J'ai mis 2,30 car il existe maintenant des extensions de nom de domaine extravagants dont on ne sait pas jusqu'à combien de caractères ils vont s'arrêter!
à ne pas oublier le signe dollar ($) qui dit
"la chaine doit se terminer ainsi" et ne rien avoir d'autre après.
$chaine = "nom.prenom@email.com";
if(!preg_match("#^[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?@[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}$#i",$chaine)) {
echo "Le mail est incorrect !";
} else {
echo "Le mail est correct !";
}
//on peut optimiser l'écriture en remplaçant [a-z0-9_-] par [-\w], \w étant égal à "0-9a-z_" (j'ai gardé [a-z0-9_-] pour l'exemple car c'est plus simple à comprendre)
//encore plus compliquée à comprendre quand on est novice, l'écrire avec une référence arrière pour éviter de réécrire les classes (\1 fait référence à "((\.[-\w]+){1,})")
preg_match("#^[-\w]+((\.[-\w]+){1,})?@[-\w]+\1?\.[a-z]{2,}$#i",$chaine)
On peut également en faire une fonction:
function verifmail($mail){
if(preg_match("#^[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?@[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}$#i",$mail)) {
return true;
} else {
return false;
}
}
if(!verifmail("le@mail.com")) {
echo "Le mail est incorrect !";
} else {
echo "Le mail est correct !";
}
Bug solutionné:
- les adresses avec plusieurs points de suite ne sont plus acceptées
Exemple:
mon@email.........com =>
mon@email.com
Nouveautés:
- La regex accepte désormais les adresses mail avec ou sans points, comme "monemail@domaine.tld" ou "mon.email.avec.points@mon.domaine.tld"
- Optimisation avec ajout du marqueur "i" qui indique "insensible à casse", les adresses avec majuscules et minuscules sont acceptées (mOn@Email.com), pensez à les passer à strtolower() ensuite
J'espère que ce script gratuit vous est utile.
Pour soutenir mon travail,
un simple don ou
mettre une note est grandement apprécié.
Votre réussite en ligne commence ici
Vous cherchez à pousser encore plus loin vos idées ou à les concrétiser avec un site internet sur mesure ? Je suis là pour vous aider ! Mon expérience en développement web est à votre disposition.
Que ce soit la création de votre site web pro ou l'apport de fonctionnalités avancées à votre projet, contactez-moi pour en discuter et avoir un devis gratuit personnalisé.
Mon objectif est de vous offrir des solutions sur mesure qui répondent à vos besoins, et votre vision associée à mon expertise donnera vie à votre projet web parfait. Contactez-moi aujourd'hui, je réponds en général en moins d'une heure :
Demander un devis
Réponse rapide !
Commentaires
Daft le 26 Décembre 2013 à 14:03
Merci pour ton script
moi le 25 Mai 2023 à 10:58
Sinon, <input type='email'> fonctionne très bien aussi...
admin le 25 Mai 2023 à 11:00
Côté HTML (client) seulement, côté serveur, il vous faut faire la vérification de ce qu'à saisie l'utilisateur pour éviter tout problèmes ! ;)
Yvan Duchitte le 12 Juin 2024 à 14:03
Je pourrais avoir des conseils sur les points svp
admin le 12 Juin 2024 à 14:04
Bonjour, quels conseils souhaitez-vous avoir ?
Retour à la liste des scripts