OVH Cloud OVH Cloud

Validation adresse e-mail

14 réponses
Avatar
- Sebastien -
Je cherche à vérifier la validité de la syntaxe (et uniquement la
syntaxe) d'adresses e-mail saisies dans un formulaire.
J'ai cherché et trouvé divers solutions, de la plus basique (test de
l'arobase) à la plus complète que j'utilise (datant du bon temps de
phpInfo.net)

function valid_email($adresse)
{
$ok = 1;
//test général
if ( !ereg("^([_A-Za-z0-9.-]+)@(([A-Za-z0-9.-])+)$", $adresse, $arr))
$ok = 0;
//test username
if ( !ereg("^([_a-zA-Z0-9-]+\.)*[_a-zA-Z0-9-]+$", $arr[1]))
$ok = 0;
//test host
if ( !ereg("^([([0-9]{1,3}\.){3,3}[0-9]{1,3}\])|(([0-9a-zA-Z-]+\.)+[a-zA-
Z]{2,4})$", $arr[2]))
$ok = 0;
return $ok;
};

Elle est bien complète mais je tombe encore sur des cas, genre :
toto.@toto.com (le . avant arobase)

Et j'ai la vue qui se brouille quand j'essaie de la modifier...

Bon je sais que le domaine ou l'adresse saisie peuvent être erronés, mais
c'est déjà une bonne vérif...


--
Seb.
ASCA Informatique
Logiciel de création d'étiquettes
http://www.asca-etiquettes.com

10 réponses

1 2
Avatar
Pierre GOIFFON
- Sebastien - wrote:
function valid_email($adresse)
{
$ok = 1;
//test général
if ( !ereg("^([_A-Za-z0-9.-]+)@(([A-Za-z0-9.-])+)$", $adresse, $arr))
$ok = 0;
//test username
if ( !ereg("^([_a-zA-Z0-9-]+.)*[_a-zA-Z0-9-]+$", $arr[1]))
$ok = 0;
//test host
if (
!ereg("^([([0-9]{1,3}.){3,3}[0-9]{1,3}])|(([0-9a-zA-Z-]+.)+[a-zA-
Z]{2,4})$", $arr[2])) $ok = 0;
return $ok;
};

Elle est bien complète mais je tombe encore sur des cas, genre :
(le . avant arobase)


Une adresse est tout à fait valide je crois. Qu'elle n'existe
pas, c'est un autre prb... Mais ça, vous ne pourrez pas le vérifier avec une
simple regexp !

Par ailleurs votre fonction me semble un brin complexe. Un seule pattern
suffirait sans doute à réaliser un test identique. Elle comporte aussi une
faute : les tld peuvent être constitués de 4 lettres... Pas très officiel
mais ça existe et ça fonctionne.

--
Pour me répondre par mail privé, merci de supprimer _NOSPAM_ de mon
adresse.

Un grand merci à OE Quote Fix pour rendre OE utilisable :)
=> http://home.in.tum.de/~jain/software/quotefix.php

Avatar
Tulan
- Sebastien - wrote:
Elle est bien complète mais je tombe encore sur des cas, genre :
(le . avant arobase)


Regarde peut être du coté des librairies PEAR, en particulier la
fonction "Mail_RFC822::parseAddressList()":

http://pear.php.net/manual/en/package.mail.php

Avatar
- Sebastien -
Pierre GOIFFON écrivait :

//test host
if (
!ereg("^([([0-9]{1,3}.){3,3}[0-9]{1,3}])|(([0-9a-zA-Z-]+.)+[a-zA-
Z]{2,4})$", $arr[2])) $ok = 0;
return $ok;
};




Par ailleurs votre fonction me semble un brin complexe. Un seule
pattern suffirait sans doute à réaliser un test identique.
Sans doute. Vive le copier/coller.


Elle comporte aussi une faute : les tld peuvent être constitués de 4
lettres... Pas très officiel mais ça existe et ça fonctionne.


{2,4} est là pour ça ... pour les .info tout à faits officiels.



--
Seb.
ASCA Informatique
Logiciels pour les PME et l'officine :
Etiquettes, Planning, Agenda
http://www.asca-etiquettes.com
http://www.pharmespace.com


Avatar
Pierre GOIFFON
- Sebastien - wrote:
Elle comporte aussi une faute : les tld peuvent être constitués de 4
lettres... Pas très officiel mais ça existe et ça fonctionne.


{2,4} est là pour ça ... pour les .info tout à faits officiels.


Gniii m'avait échappé :D Désolé

--
Pour me répondre par mail privé, merci de supprimer _NOSPAM_ de mon
adresse.

Un grand merci à OE Quote Fix pour rendre OE utilisable :)
=> http://home.in.tum.de/~jain/software/quotefix.php


Avatar
Olivier Miakinen

//test général
if ( !ereg("^([_A-Za-z0-9.-]+)@(([A-Za-z0-9.-])+)$", $adresse, $arr))
^ ^

Je ne comprends pas à quoi sert cette paire de parenthèses autour des
crochets. À vrai dire, je crois qu'elles ne servent à rien.

Sinon, je trouve dommage d'interdire les adresses e-mail avec un '+', du
genre de <om+ ou <Olivier.Miakinen+.

Personnellement, j'écrirais :
"^([_A-Za-z0-9.+-]+)@([A-Za-z0-9.-]+)$"

//test username
if ( !ereg("^([_a-zA-Z0-9-]+.)*[_a-zA-Z0-9-]+$", $arr[1]))


Il faut rajouter le '+' ici aussi. Sinon, je trouve que la lecture
serait facilitée en mettant les caractères dans le même ordre que plus
haut, mais là je chipote :

"^([_A-Za-z0-9+-]+.)*[_A-Za-z0-9-]+$"

//test host
if ( !ereg("^([([0-9]{1,3}.){3,3}[0-9]{1,3}])|(([0-9a-zA-Z-]+.)+[a-zA-
^ ^^^^^

Z]{2,4})$", $arr[2]))


1) Il ne manquerait pas un '' devant le premier '[' ?
2) Ne peut-on pas simplifier {3,3} en {3} ?

Elle est bien complète mais je tombe encore sur des cas, genre :
(le . avant arobase)


Cette syntaxe me semble bien interdite par le deuxième test, ce qui est
conforme au RFC 2822 que j'ai sous les yeux.

- est correct, et accepté par tes tests.
- , et sont tous
trois interdits par le RFC 2822, et adéquatement refusés par ton
deuxième test.

Et j'ai la vue qui se brouille quand j'essaie de la modifier...


Ne change surtout rien !

Avatar
Steph

- Sebastien - wrote:

Elle comporte aussi une faute : les tld peuvent être constitués de 4
lettres... Pas très officiel mais ça existe et ça fonctionne.


{2,4} est là pour ça ... pour les .info tout à faits officiels.



et .museum ?

Steph

--
Enlever l'adresse bidon invalide pour m'écrire



Avatar
- Sebastien -
Steph écrivait :


- Sebastien - wrote:

Elle comporte aussi une faute : les tld peuvent être constitués de 4
lettres... Pas très officiel mais ça existe et ça fonctionne.


{2,4} est là pour ça ... pour les .info tout à faits officiels.



et .museum ?

Steph



Hein ? Qui ? De quoi ?? bah zut...
Bon tant que j'y suis, y'aurait pas un fichier à dumper contenant toutes
les extensions valides ? ça irait plus vite... avé les pays et les trucs
genre museum et autres bizzareries ?

--
Seb.
ASCA Informatique
Logiciels pour les PME et l'officine :
Etiquettes, Planning, Agenda
http://www.asca-etiquettes.com
http://www.pharmespace.com




Avatar
- Sebastien -
Olivier Miakinen écrivait :


Et j'ai la vue qui se brouille quand j'essaie de la modifier...


Ne change surtout rien !


Ba voilà ce que j'attendais. Merci ;-))


--
Seb.
ASCA Informatique
Logiciels pour les PME et l'officine :
Etiquettes, Planning, Agenda
http://www.asca-etiquettes.com
http://www.pharmespace.com


Avatar
Olivier Miakinen

Ne change surtout rien !


Ba voilà ce que j'attendais. Merci ;-))


En tout cas, il ne faut rien changer concernant le traitement du '.'
dans la partie gauche de l'adresse, ce qui était l'origine de ta question.

Maintenant, tu peux quand même rajouter l'acceptation du '+' dans la
partie gauche (c'est *très* fréquemment utilisé), et sinon tu peux
simplifier le troisième test.

1er test ($adresse -> $arr)
---------------------------
Tu avais :
"^([_A-Za-z0-9.-]+)@(([A-Za-z0-9.-])+)$"

Il serait bien de rajouter au moins le '+' à gauche (voire tous ceux
listés comme 'atext' dans la RFC 2822). Sinon, il y a une paire de
parenthèses inutile à droite.

Je propose :
"^([_A-Za-z0-9.+-]+)@([A-Za-z0-9.-]+)$"

2e test ($arr[1])
-----------------
Tu avais :
"^([_a-zA-Z0-9-]+.)*[_a-zA-Z0-9-]+$"

Il faut rajouter chacun des caractères mis en 1, donc par exemple
le '+' :
"^([_a-zA-Z0-9+-]+.)*[_a-zA-Z0-9+-]+$"

3e test ($arr[2])
-----------------
Tu avais :
"^([([0-9]{1,3}.){3,3}[0-9]{1,3}])|(([0-9a-zA-Z-]+.)+[a-zA-Z]{2,4})$"

Cette regexp accepte deux types de parties droites, soit "[127.0.0.1]",
soit "www.miakinen.net". Le premier type, outre qu'il n'est vraiment pas
recommandé, a déjà été rejeté par ton premier test (pas de crochets). En
plus, comme je le signalais dans mon précédent article, il me semble que
l'oubli d'un '' le rendait faux.

Je propose donc de le simplifier comme ceci :
"^(([0-9a-zA-Z-]+.)+[a-zA-Z]{2,4}$"

Tu peux par ailleurs remplacer le 4 par un 6, voire le supprimer, pour
tenir compte d'éventuels TLD de plus de quatre lettres.


Olivier


Avatar
P'tit Marcel
"- Sebastien -" écrivit
news::

Je cherche à vérifier la validité de la syntaxe (et uniquement la
syntaxe) d'adresses e-mail saisies dans un formulaire.
J'ai cherché et trouvé divers solutions, de la plus basique (test de
l'arobase) à la plus complète que j'utilise (datant du bon temps de
phpInfo.net)


Pour faire simple :

avant l'arobas, quasiment n'importe quel caractère est autorisé. Le serveur
d'émission et les passereles sont invitées à laisser passer tel quel et de
réserver le contrôle de validité au serveur final. Un masque 'laxiste'
devrait être le mieux, comme : [^ <>@]+

après l'arobas, l'important est d'autoriser les extensions jusqu'à 6
caractères (pour http://index.museum/). J'ai vu que tu autorisais
l'adressage IP [nnn.nnn.nnn.nnn]. A la limite tu pourrais t'en dispenser
car je ne crois pas avoir jamais vu utilisée une adresse de ce type.

eça

1 2