Facebook
Télécharger
Noter:

Ajouté le 2021-12-02
Visionné 4884 fois
5/5 (3)

Vérifier une adresse mail en PHP

Description

Ce script simple (quand on sy connait un minimum en expression régulière), permet de vérifier si une adresse mail est correcte, souvent utilisé lors de l'envoi d'un formulaire de contact ou de la création d'un compte membre en PHP, valider un mail est important pour s'assurer que l'utilisateur à correctement renseigné le champ du formulaire.

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

Petite parenthèse

Je vous met des sites sympas pour apprendre les expressions régulière en PHP, des sites pratiques à garder sous le coude !

Tutoriel Expressions régulières PCRE : lumadis.be/regex/
https://lumadis.be/regex/tuto_pcre.php [/pencher]

Expreg.com
http://www.expreg.com/symbole.php [pencher]



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 dir: ".duTexteEtDesChiffresAvec_et-" qui peut se répéter à l'infini grâce à {1,} qui veut dire "1 fois ou plus".

Ensuite on vérifie si il y a le fameux 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 sais 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 !";
}



Besoin d'un web développeur ?

Je suis disponible, contactez-moi !

Commentaires

Ajouter un commentaire

Commenter
Pseudo/Nom
Email
Message
Captcha
memo2
Commenter

Daft le 26 Décembre 2013 à 14:03

Merci pour ton script

Retour à la liste des scripts