Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

VÉRIFICATION D'E-MAILS PAR EXPRESSIONS RÉGULIÈRES


Information sur la source

Catégorie :Formulaire Niveau : Expert Date de création : 23/06/2002 Date de mise à jour : 20/01/2006 12:19:16 Vu : 11 515

Note :
9 / 10 - par 4 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (47)
Ajouter un commentaire et/ou une note

Description

Grace aux expressions régulières nous allons pouvoir tester en une seule fonction la syntaxe d'une adresse email entrée par l'utilisateur.
En plus je vous met le code de la page HTML pour tester immédiatement la fonction !

boolean is_email(string email)

Paramètre :
email : email dont on veux vérifier la syntaxe.
Valeur de retour :
true si la syntaxe de l'email est correcte, false sinon.

Il s'agit d'une simplication de la RFC 822 => http://jlr31130.free.fr/rfc822.html
Pour ceux qui veulent des vérifications plus poussée je vous invite à lire cette source :
http://www.javascriptfr.com/code.aspx?ID=35656

Une fois que la syntaxe de l'email est validée, n'oubliez pas d'interroger le serveur (parti domaine de l'email) pour lui demander si cet email existe vraiment !
 

Source

  • <html>
  • <head>
  • <title>javascript:is_email()</title>
  • <script type="text/javascript" language="javascript">
  • <!--
  • function is_email(email)
  • {
  • var word = "[-!#-'*+/-9=?A-Z^-~\x80-\xFF]+";
  • /* Interdits : Caractères de contrôle et [ "(),.:;<>@\] ([] compris). */
  • var pattern = "^(" + word + "\.)*" + word + "@(" + word + "\.)+" + word + "$";
  • var reg = new RegExp(pattern, '');
  • return reg.test(email);
  • }
  • function test_email(email, is_valid)
  • {
  • var test = document.getElementById('test');
  • var result = is_email(email);
  • test.innerHTML +="is_email('" + email + "') == " + (result ? 'true' : 'false');
  • test.innerHTML += ((result == is_valid) ? ' (Ok)' : ' (Echec)') + '<br />';
  • }
  • function start()
  • {
  • test_email("webmaster@javascriptfr.com", true);
  • test_email("webmaster@javascriptfr..com", false); /* a cause du .. */
  • test_email("web.master@javascriptfr.com", true);
  • test_email("webmaster.@javascriptfr.com", false); /* a cause du .@ */
  • test_email("-webmaster-@javascriptfr.com", true); /* le tiret est authorisé par la RFC */
  • test_email("{webmaster}@javascriptfr.com", true); /* ainsi que les {} */
  • test_email("[webmaster]@javascriptfr.com", false); /* mais pas les [] */
  • test_email("=^?é~î)-!#'@javascriptfr.com", true); /* testons quelques caractères spéciaux */
  • }
  • -->
  • </script>
  • </head>
  • <body onload="javascript:start()">
  • <div id="test"></div>
  • </body>
  • </html>
<html>
	<head>
		<title>javascript:is_email()</title>
		<script type="text/javascript" language="javascript">
<!--
function is_email(email)
{
	var word = "[-!#-'*+/-9=?A-Z^-~\x80-\xFF]+";
	/* Interdits : Caractères de contrôle et [ "(),.:;<>@\] ([] compris). */
	var pattern = "^(" + word + "\.)*" + word + "@(" + word + "\.)+" + word + "$";
	var reg = new RegExp(pattern, '');
	return reg.test(email);
}

function test_email(email, is_valid)
{
	var test = document.getElementById('test');
	var result = is_email(email);
	test.innerHTML +="is_email('" + email + "') == " + (result ? 'true' : 'false');
	test.innerHTML += ((result == is_valid) ? ' (Ok)' : ' (Echec)') + '<br />';
}

function start()
{
	test_email("webmaster@javascriptfr.com", true);
	test_email("webmaster@javascriptfr..com", false); /* a cause du .. */
	test_email("web.master@javascriptfr.com", true);
	test_email("webmaster.@javascriptfr.com", false); /* a cause du .@ */
	test_email("-webmaster-@javascriptfr.com", true); /* le tiret est authorisé par la RFC */
	test_email("{webmaster}@javascriptfr.com", true); /* ainsi que les {} */
	test_email("[webmaster]@javascriptfr.com", false); /* mais pas les [] */
	test_email("=^?é~î)-!#'@javascriptfr.com", true); /* testons quelques caractères spéciaux */
}
-->
		</script>
	</head>
	<body onload="javascript:start()">
		<div id="test"></div>
	</body>
</html>

Conclusion

Vous avez sans doute déjà remarqué que j'ai cette fois décomposé la construction de l'expression régulière en deux parties, afin d'en simplifier la compréhension.
Histoire qu'on rigole un peu l'expression régulière utilisée est en réalité :
/^([-!#-'*+/-9=?A-Z^-~\x80-\xFF]+\.)*[-!#-'*+/-9=?A-Z^-~\x80-\xFF]+@([-!#-'*+/-9=?A-Z^-~\x80-\xFF]+\.)+[-!#-'*+/-9=?A-Z^-~\x80-\xFF]+$/
Outch ! Non, ne fuyez pas ;^)

Etape 1 :
var word = "[-!#-'*+/-9=?A-Z^-~\x80-\xFF]+";
[ ] : Les crochets signifient que l'on cherche un des caractères présents entre les crochets.
[-!#'*+] : Ici par exemple la recherche aboutira avec "-", "!", "#", "'", "*" ou "+".
[-!#'*+]+ : Le "+" indique que ce qui précède doit apparaitre une ou plusieurs fois, ainsi la recherche pourra trouver la chaîne "+-+#!" par exemple.
[A-Z]+ : Il est aussi possible de spécifier plusieurs caractères ASCII d'affilé grace au tiret (Sous windows allez dans Démarrer > Programmes > Accessoires > Outils sytème > Table des caractères). Notez que le tiret perd sa signification spéciale s'il placé en premier après le "[" (comme c'est le cas ici).
[\x80-\xFF]+ : Autorise les caractères ASCII de 128 à 255 (soit de 80 à FF en hexadécimal). Il est en effet possible d'utiliser les tables ASCII étendues dans les emails (et donc les accents), même si l'affichage correct de ces caractères chez les contacts n'est pas garantie !
[-!#-'*+/-9=?A-Z^-~\x80-\xFF]+ : Autorise les caractères "-", "!", de "#" à "'", "*", "+", de "/" à "9", "=", "?", de "A" à "Z", de "^" à "~" et les caractères ASCII étendus.
Cela revient à interdire les caractères de contrôle (ASCII de 0 à 31), l'espace et les caractères suivants : ["(),.:;<>@\] (Les [] sont interdits aussi).

Notez bien que les caractères "." et "@" sont interdits !!
"word" represente un mot de la chaîne par exemple avec l'adresse "web.master@javascript.fr.com" les mots sont "web", "master", "javascript", "fr" et "com".

Etape 2 :
Je reprend ma chaîne pattern en remplacant "word" par "W" (pour qu'on puisse la lire plus facilement) :
var pattern = "^(W\.)*W@(W\.)+W$";
^ $ : Indique que la recherche se fait dès le debut et jusqu'a la fin de la chaîne (il ne peut pas y avoir de caractères sautés en début et fin).
\. : Le slash permet d'éviter que le "." soit interprété comme une commande (Le point remplace n'importe quel caractère). Il faut faire la même chose si vous desirez rechercher la présence de caractères tels que "+" ou "^".
^W\.W$ : Signifie que la chaîne entière est un mot suivie d'un unique point puis d'un autre mot. Par exemple "javascriptfr.com" mais pas "@javascriptfr.com" ou "javascriptfr".
^(W\.)W$ : Les parenthèses n'ont aucunes signification, elle permettent juste de faire des "groupements".
^(W\.)*W$ : L'étoile signifie que ce qui précède doit apparaître 0 ou plus de fois. Grace aux parenthèses, "ce qui précède" est un mot suivit d'un point. Par exemple ici la recherche va réussir avec "web.master" ou "webmaster" ou encore avec "w.e.b.m.a.s.t.e.r".
^(W\.)*W@$ : L'arobasse n'a pas de signification propre, il faut jusque que la chaîne contienne ce caractère a cet endroit. Exemple : "webmaster@".
^(W\.)+W$ : Le "+" signifit toujours un ou plus, ici on veux une série d'au moins 2 mots séparés par des "." (soit un nom de domaine avec une extension). Par exemple "javascriptfr.com" ou "javascript.fr.com" mais pas "javascriptfrcom".
^(W\.)*W@(W\.)+W$ : On veux une série d'au moins 1 mot séparé(s) par des "." suivit par un "@" puis par une autre série d'au moins 2 mots séparés à nouveau par des ".".


Melnofil,
Pkoi j'ai pas le droit a un niveau 4 rien que pour moi ?
 

Historique

17 janvier 2006 12:52:15 :
Après 3 ans des gens viennent toujours commenter ma source alors voici un petit cadeau : Une toute nouvelle version du script qui suis précisement la RFC (attention comme pour la RFC il n'y a pas de taille maximale pour les "mots" et donc pour l'extension de l'email) En plus comme je suis sympa je vous fourni une batterie de test qui va avec ! Je modifierais les explications plus tard ! Source : http://magali.contensin.free.fr/html/JAVASCRIPT/cours/PREDEF/ExpressionsReg.html
18 janvier 2006 11:28:04 :
Comme prévu voiçi les commentaires qui vont avec...
20 janvier 2006 12:19:16 :
Ajout d'un lien vers la source de sivispacem qui a mieux étudié le problème des e-mails que moi qui ai fait ca à l'arrache ;^)

Commentaires et avis

signaler à un administrateur
Commentaire de fabrice69 le 24/06/2002 22:46:04 administrateur CS

Pas mal ton code.
Un peu complexe pour les débutants mais puissant.

F___

signaler à un administrateur
Commentaire de scantoine le 08/08/2002 09:33:01

super le code et avec les explications en plus c cool

signaler à un administrateur
Commentaire de VirtualReckless le 09/11/2002 18:44:35

bien...bien...on vas voté pour un nivo 4 hein ;p
nan serieu bon code et bonne explication
heu p'tite annoce qu'a rien avoir mais bon... : vous petez pas les couilles a trouver un hébergeur k'accepte la fonction email(........) en php, multimania l'accepte.
allez ++

signaler à un administrateur
Commentaire de Sylvaninox le 23/05/2003 20:33:59

Je ne vois pas bien en quoi le reg2 est indispensable !?
En effet, dans le reg(1) il y a déjà la contrainte d'au moins 2 caractères "{2,}" après le @.
L'@ et le . ne peuvent donc pas être collés !

Dites-moi si je me trompe parce que sinon y'a un truc ke j'ai pas compris :-)

A part ça c'est une très bonne solution pour vérifier la validité d'un mail !

signaler à un administrateur
Commentaire de Melnofil le 25/05/2003 19:50:44

tout simplement parsque le nom du fournisseur (et le nom d'utilisateur aussi !) peut contenir des . d'ailleurs regarde bien le point est caché entre le 9 et le _ :
     [a-zA-Z0-9._-]{2,}
De plus ne sont pas valides les adresses du style xx..xx@xxx.xxx ou xxx@xx..xx.xxx avec deux points de suite.
Voilà ++

signaler à un administrateur
Commentaire de Sylvaninox le 25/05/2003 20:27:12

ah oui effectivement j'avais pensé à ça !

Merci bcp de ta réponse !

@+

signaler à un administrateur
Commentaire de sivispacem le 18/09/2003 13:09:05

Pourquoi pas :
function EmailOK(sMail)
{
var re = /([a-z0-9]+([-_]?[a-z0-9]+)*.)*[a-z0-9]+([-_]?[a-z0-9]+)*@([a-z0-9]+([-_]?[a-z0-9]+)*.)+[a-z]{2,4}/gi;  
return (sMail.value.match(re) == sMail.value);  
}

Pour les email de type minimum : x@x.xx
et maximum : n(nx.)nx@n(nx.)xxx

Je ne sais pas s'il existe des courriels de la forme x@x.xx !
@+

signaler à un administrateur
Commentaire de reblochon le 20/10/2003 03:21:49

Que de chichi
re= /^((?:w+(?:-|.)?w+)+)@((?:w+(?:-|.)?w+)+.w{2,3})$/
avec ca et un test on peut en plus resortir le nom avec RegExp.$1 et le domaine avec RegExp.$2

juste pour info  [a-z0-9] et [-_] = w et - le _ est considéré comme un char alphanumerique [a-zA-Z0-9_]
je ne l'ai pas mis non plus, mais les gens qui n'ont pas un nom de domaine comme une adresse IP ??? ils font comment pour mettre leur email ??? ___toto-le-banit___@90.60.25.15  :o(

En dernier lieu, le point  .  en expression reguliere represente n'importe quel char c'est egal à [wW]. Pour mettre un point il faut le noter [.]


Je n'ai pas envie d'expliquer comment fonctionne la page qui suit mais si ca interesse du monde, elle permet de faire des test tres pratique sur les expressions regulieres en direct et simplement:
http://pages.infinit.net/glopglop/local/expression.html
Les exemples ne sont vraiment pas à jour. et les aides viennent majoritairement de devedge.netscape.com








signaler à un administrateur
Commentaire de reblochon le 20/10/2003 03:27:00

ok j'ai compris pourquoi c'est plein de fautes.
au niveau QI, je suis une moule...

gnagnagna...dans une string il faut mettre deux  backslash pour en afficher un!!...gnagnagna
Deuxieme essai:

re= /^((?:\w+(?:\-|\.)?\w+)+)\@((?:\w+(?:\-|\.)?\w+)+.\w{2,4})$/

juste pour info  [a-z0-9] et [\-\_] = [\w] et [\-] le _ est considéré comme un char alphanumerique [a-zA-Z0-9_]

En dernier lieu, le point  .  en expression reguliere represente n'importe quel char c'est egal à [\w\W]. Pour mettre un point il faut le noter [\.]

maintenant je vais me coucher le cerveau, il est mourru...

signaler à un administrateur
Commentaire de Melnofil le 24/10/2003 18:21:39

En réponse à reblochon :
Effectivement on doit pouvoir utiliser des jokers pour les tests standards (caractère alphabétique, alphanumérique, etc.). D'un autre coté comme t a peut près aussi clair que sivispacem juste au dessus, j'ai pas compris ce que ton code apporte en plus (à propos, le . n'est pas un caractère quelconque s'il est mis dans les [] justement, relis les explications).
Pour ce qui est des fournisseurs qui ont un ip fixe mais pas de domaine, j'en ai jamais vu, mais si ca peut te rassurer, ils marchent avec mon code puisque l'extension est en [a-zA-Z0-9]{2,4} donc avec des chiffres aussi.
Pour ce qui est des sortir le domaine et le nick du mail, ceci n'est pas le but de mon code ; de plus, on peut le faire beaucoup plus simplement en utilisant les tokens (en utilisant @ comme séparateur).
Voilà ++ &lt;== Je deviens sénile

signaler à un administrateur
Commentaire de reblochon le 25/10/2003 05:34:09

Tu as raison pour le point entre deux crochets. on en apprend tous les jours, je vais me coucher heureux et moins con (toujours ca de gagné).

Mon code n'apporte rien techniquement, je disais simplement qu'on n'ecrit pas vraiment la combinaison complete [a-zA-Z0-9_] quand elle se resume par \w

c'est beaucoup de chichi pour si peu. Pour le fonctionnement c'est identique, mais la ou je bosse, ca fait la difference entre un employé et un ex-employé. En plus ta methode est si complexe que tu est obligé d'appeler un reg2 pour un deuxieme test.

Je sais que ce n'etait pas le but de ton code de sortir le nick et le domaine. Mais ce n'est pas plus facile avec les tokens etant donné que c'est deja fait au moment de l'evaluation et qu'il ne reste plus qu'à appeler les RegExp.$

En 2 ligne sans forcé et faire le mariole:
function is_email(email)  {
return /^((?:\w+(?:\-|\.)?\w+)+)\@((?:\w+(?:\-|\.)?\w+)+.\w{2,4})$/.test(email); }

bonne soiree
Philippe

signaler à un administrateur
Commentaire de Melnofil le 27/10/2003 17:45:11

"etant donné que c'est deja fait au moment de l'evaluation" &lt;== wé ca c si on veut faire les 2 en meme temps, ce qui est d'autant plus hors sujet :)
Soit disant passant, ton "sans forcé et faire le mariole" hé ben oups j'ai oublié le . et ca donne test@mailcom valide ...
bon ok je fait des chichi aussi, d'un autre coté j'ai donné ce code en démonstrations pour faire &gt;&gt;découvrir&lt;&lt; les expressions régulières aux nombreuses personnes qui ont postés des vérification de mail avec des tonnes de if avant moi. D'une manière générale la qualité du site est pas trop recommandés pour un niveau professionnel mais bon, c toi qui vois ...

signaler à un administrateur
Commentaire de reblochon le 07/11/2003 21:53:59

oui ca retourne valide, car j'ai encore oublié de mettre deux backslach pour que ca en affiche un sur ce forum. donc avant le \w{2,4} il faut lire \.\w{2,4} au lieu de .\w{2,4}

Pour repondre au insinuation:
1- Le site date d'avant mes etudes en info. J'etais amateur novice
je ne l'ai jamais refait car j'ai autre chose à faire de plus constructifs que d'afficher mes affaires persos qui je suis sur passionnent le monde entier.

2- Sur le site, les outils developpés pour tester le code ont ete fait rapidement pour repondre à un besoin, ils sont fonctionnels, pas esthetiques, ni convivials, donc parfait pour l'utilité prevue.

3- je pense que 3 ans de dev dans un grand groupe americain (SUNGARD) pour des sites reservés aux brokers (courtiers), avec le niveau de securité, de serieux et d'importance (plusieurs millions de transactions sql par heure) qu'on peut imaginer dans le milieu de la bourse, doivent quand meme me donner le niveau de professionnel en web. Toutes secondes perdues dans un code lourd, c'est des millions qui ne sont pas negociés. Pour te dire, ils ne gardent que les meilleurs, c'est pour ca que j'ai ete viré. Je suis en dessous des meilleurs. Ce qui fait quand meme de moi, je pense, un bon programmeur professionnel, sinon je n'aurais jamais tenu 3 ans avec en plus les compliments de mes superieurs pour mon travail.

4-On est ici dans javascriptfr. Les tokens dont tu parles, c'est dans PHP si je ne me trompe! Tu parles d'utiliser @ comme separateur, j'en conclu qu'il va y avoir une ligne de plus, de toute facon. Mais c'est vrai que j'ai fait un hors sujet. desolé pour ce point. Et j'apprecie ton initiative de faire decouvrir les Expressions, car c'est en effet depassé les verifications de chaines, en 18 lignes de if imbriqués. Ne pas trop abuser des "Reg"s quand meme car les fonctions natives du JavaScript sont bien plus rapides pour des besoins simples.

5- pour repondre à sivispacem: il exixte des sites x.xxx donc il existe des adresses xxx@x.xxx, donc ton code est en effet mieux structuré car il permet comme tu le dis si bien de repondre aux mails:
de type minimum : x@x.xx
et de type maximum : n(nx.)nx@n(nx.)xxx

exemple:http://www.x.com/ ou http://www.z.com/

Je ne suis pas vexé et ne souhaite pas t'irriter, j'aime bien argumenter, c'est tout.
Toujours pret pour critiquer et etre critiqué (c'est comme ca qu'on evolue)

grosses bises
Philippe  

Ps: je vais voir si j'ai pas du temps pour refaire mon site. Je pense qu'il merite mieux en effet.




signaler à un administrateur
Commentaire de Melnofil le 13/11/2003 02:40:31

Super ma réponse est même pas parvenue. Bon je vais faire plus court :
1) Les tokens ctait pour juste extraire le nick/host sans vérifier l'email. Désolé d'en avoir parlés s'ils n'existent pas en js.
2) Merci pour les address en une lettre je connaissait pas, ca m'a fait pensé a l'histoir des ip (on peut avoir entre 0 et 9) donc l'extention en 1 caractere doit exister aussi
3) Loin d'être rancunier, c que j'aime pas me prendre la tete dans un language que je ne maîtrise pas et que je n'ai pas l'interêt d'apprendre actuellement, c tout.

*esquive la bise et serre la main de Philippe*
Toute nouvelle connaissance est toujours bonne à prendre aussi merci pour ta participation ^^

signaler à un administrateur
Commentaire de michel_roger le 11/12/2004 01:10:20

Merci beaucoup pour l'explication finale, très utile car g toujours été une brêle en expression régulières ;-)

signaler à un administrateur
Commentaire de lordskyser1 le 06/04/2005 00:14:22

oula vous etes balèzes vous en expression régulières vous! bravo! j'essaie de les comprendre par moi même mais ce n'est pas évident à vrai dire. J'aurais juste une paire de questions :
1) qui a proposé la meilleure solution? (à mon niveau je n'arrive pas à juger c'est trop complexe).
2) Est-ce qu'une adresse mail ne doit contenir qu'une et une seule arobase??? si c'est le cas, ces expressions régulières en tiennent elles compte? Sinon comment faire pour intégrer cela?
Voilà, j'espère que quelqu'un aura l'amabilité de me répondre, çà m'aiderai d'autant plus que je dois vérifier la validité d'un email pour un tp a rendre après demain!

à part çà, pour contrôler la validité du domaine, vous pouvez stocker la liste suivante dans une variable, la transformer en tableau avec chaine.split(".") puis tester si l'extension de l'email (récupérée avec chaine.substr(chaine.lastIndexOf("."))) correspond à une extension existante :

ac.ad.ae.af.ag.ai.al.am.an.ao.aq.ar.as.at.au.aw.az.ba.bb.bd.be.bf.bg.bh.bi.bj.bm.bn.bo.br.bs.bt.bv.bw.by.bz.ca.cc.cd.cf.cg.ch.ci.ck.cl.cm.cn.co.cr.cs.cu.cv.cx.cy.cz.de.dj.dk.dm.do.dz.ec.ee.eg.eh.er.es.et.fi.fj.fk.fm.fo.fr.fx.ga.gb.gd.ge.gf.gg.gh.gi.gl.gm.gn.gp.gq.gr.gs.gt.gu.gw.gy.hk.hm.hn.hr.ht.hu.id.ie.il.im.in.io.iq.ir.is.it.je.jm.jo.jp.ke.kg.kh.ki.km.kn.kp.kr.kw.ky.kz.la.lb.lc.li.lk.lr.ls.lt.lu.lv.ly.ma.mc.md.mg.mh.mk.ml.mm.mn.mo.mp.mq.mr.ms.mt.mu.mv.mw.mx.my.mz.na.nc.ne.nf.ng.ni.nl.no.np.nr.nt.nu.nz.om.pa.pe.pf.pg.ph.pk.pl.pm.pn.pr.ps.pt.pw.py.qa.re.ro.ru.rw.sa.sb.sc.sd.se.sg.sh.si.sj.sk.sl.sm.sn.so.sr.st.su.sv.sy.sz.tc.td.tf.tg.th.tj.tk.tm.tn.to.tp.tr.tt.tv.tw.tz.ua.ug.uk.um.us.uy.uz.va.vc.ve.vg.vi.vn.vu.wf.ws.ye.yt.yu.za.zm.zr.zw.com.edu.gov.int.mil.net.org.biz.pro.info.aero.name.coop.arpa.nato.museum

jpense que vous aviez déjà trouvé çà, mais bon, il peut toujours être utile de le rappeler, enfin a vous de voir.

Bonne continuation, un newbie anonyme

signaler à un administrateur
Commentaire de reblochon le 06/04/2005 14:49:38

1) aucune. C'est juste une facon differente de coder.
2) Arobas unique et oui c'est pris en compte.

regarde ici: http://www.webreference.com/js/column5/
et là: http://pages.videotron.com/glopglop/local/help_expression01.html (source: ancien site developer.netscape.com)

c'est en anglais mais les exemples sont assez clair et simple. Et il y a des tableaux recapitulatifs. De toute facon, tu devrais aujourd'hui trouver un paquet de sites francais expliquant ceci de facon clair. Apres le mieux, c'est de se faire une petite page local avec deux trois champs permettant de tester rapidement les resultats donc facilitant l'apprentissage.

Exemple:
http://pages.videotron.com/glopglop/local/expression_light.html

Tape dans le premier champ \\d+
Puis selectionne le checkbox flag "g" et le checkbox  "Dynamique"
Ecris dans le deuxieme champ une serie de lettres et de chiffres au hasard (plusieurs qui se suivent, puis separés)

Tu devrais voir le resultat d'un match (selectionné par defaut dans le select) dans le textarea en dessous.

bon courage, ce n'est pas si dur que ca à assimiler et c'est si pratique.

signaler à un administrateur
Commentaire de sivispacem le 06/04/2005 15:42:42

pas bon le code :
laisse passer : .___@---__----___----.fr__ comme adresse.
erreur de débuter avec un point, un nom de domaine avec
caractères interdits.
à rappeler:
- Un nom de domaine doit comporter entre 2 et 63 caractères (les x.com et z.com sont bloqués et redirigés)
- Il ne peut comporter que des lettres, des chiffres et (n'importe où sauf en première ou en dernière position) le signe "-".
Donc _ interdit !
Le TLD ne doit contenir que des caractères, et de 2 (nationnaux) à 6 (museum).
Voir http://www.iana.org/gtld/gtld.htm

signaler à un administrateur
Commentaire de lordskyser1 le 06/04/2005 15:47:31

ok merci. Puisque chacun y va de son expression régulière pour le contrôle d'un mail, je me lance aussi. Elle me paraît plus simple à comprendre, enfin c'est question de goût :-D

/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-z0-9-]+.[a-z0-9]+$/

Voila c pa encore tt à fait çà car -@-.x est accepté... ms bon c un debut. a + tchao

signaler à un administrateur
Commentaire de sivispacem le 06/04/2005 16:25:01

terminer par \.[a-z]{2,6} pour les nationaux
à .museum
on peut aussi coder la partie domaine
par l'adresse IP entre crochets, cela donne
[(\d{1,3}\.){3}\d{1,3}\]
il manque ici l'interdiction de dépasser 255.

signaler à un administrateur
Commentaire de lordskyser1 le 06/04/2005 16:47:08

Deuxième version un peu améliorée

/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-z0-9-]+(.[a-z0-9]{2,}){1,2}$/

mais j'ai toujours le pb du -@-.com qui passe

signaler à un administrateur
Commentaire de lordskyser1 le 06/04/2005 17:23:18

voila version finale (enfin j'ai pas trouvé d'erreur en faisant les tests mais j'en ai pt être oublié) :

/^[a-zA-Z0-9]+((\.?|-?|_?)[a-zA-Z0-9]+)*@[a-z0-9]+([-_]?[a-z0-9]+)?(.[a-z0-9]{2,}){1,2}$/

je sais que l'expression est un peu longue et qu'il y a surement moyen de "factoriser" çà, mais bon, a part çà qu'en pensez vous?

signaler à un administrateur
Commentaire de sivispacem le 06/04/2005 17:43:41

marche pas
rappel : le point signifie tous caractère sauf le
le caractère nouvelle ligne.
pour coder le point lui même il faut utiliser \.
donc ton expression laisse passer n'inporte quoi.
essaye : xx@xx, ça passe.
essaye
[a-z\d][a-z\d-]{0,62}[a-z\d]\.[a-z]{2,6}
pour le domaine et le tld
ou
(?!-)[a-z\d-]{1,62}[a-z\d]\.[a-z]{2,6}
plus court

signaler à un administrateur
Commentaire de lordskyser1 le 06/04/2005 22:28:38

précises à qui tu parles sivispacem, j'ai cru ke ca m'était adressé. Si c'est la cas, c'est que tu n'a pas testé mon expression car xx@xx ou xx@xx, çà ne passe pas chez moi, même si je n'ai pas mis de backslash devant le point. d'ailleurs voilà ma fonction de contrôle de emails, un peu lourde, mais efficace :

function EmailValide(email)
{
   /* 1) On vérifie que le formatage de l'email est correct
      On déclare une variable qui correspond à une expression régulière.
  L'email doit contenir
   */
   var FormatValide = false;
   var ExpressionReguliere = /^[a-zA-Z0-9]+((\.?|-?|_?)[a-zA-Z0-9]+)*@[a-z0-9]+([-_]?[a-z0-9]+)?(.[a-z0-9]{2,}){1,2}$/;
   if (email.search(ExpressionReguliere) != -1)
   {
      FormatValide = true;
   }
  
   // 2) On cherche à déterminer si le domaine de l'e-mail est valide

   var DomaineValide = false;
   var PositionDernierPoint = email.lastIndexOf(".");
   var PositionDernierArobase= email.lastIndexOf("@");
   // Si il y a un point, une arobase, et que le denrier point est situé après l'arobase
   if ((PositionDernierArobase > 0) && (PositionDernierPoint > 0 ) &&
       (PositionDernierArobase < PositionDernierPoint))
   {
      // Variable qui contient la liste des extensions de domaines existant
      var ListeExtensionsDomaines = 'ac.ad.ae.af.ag.ai.al.am.an.ao.aq.ar.as.at.au.aw.az.ba.bb.bd.be.bf.bg.bh.bi.bj.bm.bn.bo.br.bs.bt.bv.bw.by.bz.ca.cc.cd.cf.cg.ch.ci.ck.cl.cm.cn.co.cr.cs.cu.cv.cx.cy.cz.de.dj.dk.dm.do.dz.ec.ee.eg.eh.er.es.et.fi.fj.fk.fm.fo.fr.fx.ga.gb.gd.ge.gf.gg.gh.gi.gl.gm.gn.gp.gq.gr.gs.gt.gu.gw.gy.hk.hm.hn.hr.ht.hu.id.ie.il.im.in.io.iq.ir.is.it.je.jm.jo.jp.ke.kg.kh.ki.km.kn.kp.kr.kw.ky.kz.la.lb.lc.li.lk.lr.ls.lt.lu.lv.ly.ma.mc.md.mg.mh.mk.ml.mm.mn.mo.mp.mq.mr.ms.mt.mu.mv.mw.mx.my.mz.na.nc.ne.nf.ng.ni.nl.no.np.nr.nt.nu.nz.om.pa.pe.pf.pg.ph.pk.pl.pm.pn.pr.ps.pt.pw.py.qa.re.ro.ru.rw.sa.sb.sc.sd.se.sg.sh.si.sj.sk.sl.sm.sn.so.sr.st.su.sv.sy.sz.tc.td.tf.tg.th.tj.tk.tm.tn.to.tp.tr.tt.tv.tw.tz.ua.ug.uk.um.us.uy.uz.va.vc.ve.vg.vi.vn.vu.wf.ws.ye.yt.yu.za.zm.zr.zw.com.edu.gov.int.mil.net.org.biz.pro.info.aero.name.coop.arpa.nato.museum.EoF'
      // Variable qui contient la liste des extensions de domaines précédente sous forme de tableau
  var TableauExtensionsDomaines = ListeExtensionsDomaines.split(".")
  /* Variable qui contient l'extension de l'email saisi par l'utilisateur (on récupère la chaîne
     située après le dernier point) */
  var ExtensionEmail = email.substr(PositionDernierPoint+1)
  // On convertit l'extension en minuscuel (des fois qu'elle contienne des majuscules)
  ExtensionEmail = ExtensionEmail.toLowerCase()
  // Pour chaque extension de domaine
  for (i = 0; i < TableauExtensionsDomaines.length; i++)
  {
     // Si on arrive à la fin de la liste des extensions de domaines
     if (TableauExtensionsDomaines == 'EoF')
    break; // On sort de la boucle
// Si l'extension de l'email correspond à une extension de domaine de la liste
if (ExtensionEmail == TableauExtensionsDomaines[i])
{
    DomaineValide = true // C'est que le domaine est valide
break; // On sort de la boucle
} // Fin if (intérieur boucle)
   } // fin boucle for
    } // Fin if (1er if)
   return (FormatValide && DomaineValide);
}

jla posteré en source plus tard. Par contre, comment fair epour autoriser les caractères accentués mais pas les autres du style ] ??? j'ai trouvé çà nul par, c possible??? au revoir

signaler à un administrateur
Commentaire de sivispacem le 06/04/2005 23:05:16

OK lordskyser1 j'ai testé.
il reste que @[192.252.19.3] c'est permis !
voila les 3 fonctions que j'utilise pour le nom de
domaine (un peu plus court car je crée peu de variables)

//-----------------------------------------------------------------
function DomainIPOK(Dom)
{
/* <adresseIP> = <short>.<short>.<short>.<short>
<short> = un, deux, ou trois chiffres représentant un
          entier décimal de 0 à 255
*/
  if (Dom.match(/\[(\d{1,3}\.){3}\d{1,3}\]$/g)!=Dom) return false;
  var tIP=Dom.substring(1,Dom.length-1).split(".");
  if (tIP.length!=4) return false;
  for (var i=0;i<4;i++) {if (tIP[i]>255) return false;}
  if ((tIP[0]==255)||(tIP[0]==0)||(tIP[3]==0)) return false;
  return true;
}
//-----------------------------------------------------------------
function DomainTxtOK(Dom)
{
  return Dom.match(/((?!-)[a-z\d-]{1,62}[a-z\d]\.){1,4}[a-z]{2,6}$/gi)==Dom;
}
//-----------------------------------------------------------------
function DomainExtOK(Dom)
{
var tExt='ac.ad.ae.af.ag.ai.al.am.an.ao.aq.ar.as.at.au.aw.az.ba.bb.bd.be.bf.bg.bh.bi.bj.bm.bn.bo.br.bs.bt.bv.bw.by.bz.ca.cc.cd.cf.cg.ch.ci.ck.cl.cm.cn.co.cr.cs.cu.cv.cx.cy.cz.de.dj.dk.dm.do.dz.ec.ee.eg.eh.er.es.et.fi.fj.fk.fm.fo.fr.fx.ga.gb.gd.ge.gf.gg.gh.gi.gl.gm.gn.gp.gq.gr.gs.gt.gu.gw.gy.hk.hm.hn.hr.ht.hu.id.ie.il.im.in.io.iq.ir.is.it.je.jm.jo.jp.ke.kg.kh.ki.km.kn.kp.kr.kw.ky.kz.la.lb.lc.li.lk.lr.ls.lt.lu.lv.ly.ma.mc.md.mg.mh.mk.ml.mm.mn.mo.mp.mq.mr.ms.mt.mu.mv.mw.mx.my.mz.na.nc.ne.nf.ng.ni.nl.no.np.nr.nt.nu.nz.om.pa.pe.pf.pg.ph.pk.pl.pm.pn.pr.ps.pt.pw.py.qa.re.ro.ru.rw.sa.sb.sc.sd.se.sg.sh.si.sj.sk.sl.sm.sn.so.sr.st.su.sv.sy.sz.tc.td.tf.tg.th.tj.tk.tm.tn.to.tp.tr.tt.tv.tw.tz.ua.ug.uk.um.us.uy.uz.va.vc.ve.vg.vi.vn.vu.wf.ws.ye.yt.yu.za.zm.zr.zw.com.edu.gov.int.mil.net.org.biz.pro.info.aero.name.coop.arpa.nato.museum'.split(".");
var Ext = Dom.substr(Dom.lastIndexOf(".") + 1).toLowerCase();
  for (var i=0; i<tExt.length; i++) {if (Ext==tExt[i]) return true;}
  return false;
}
//-----------------------------------------------------------------

signaler à un administrateur
Commentaire de sivispacem le 06/04/2005 23:17:18

lordskyser1 si tu fait :

if(email.search(/^[a-zA-Z0-9]+((\.?|-?|_?)[a-zA-Z0-9]+)*@[a-z0-9]+([-_]?[a-z0-9]+)?(.[a-z0-9]{2,}){1,2}$/)==-1) return false;
tu ne stocke pas de variable et tu sort immédiatement de ta fonction, c'est donc plus rapide et moins gourmand en mémoire.
on termine simplement la fonction après tous les tests par un
return true;

signaler à un administrateur
Commentaire de lordskyser1 le 06/04/2005 23:17:54

@[192.252.19.3] c'est plutot rare ca, ta chopé çà où comme adresse??? j'ai jamais vu çà, ya une norme qui l'autorise? tu sais laquelle que j'aille jeter un d'oeil stp? tes fonctions ont l'air pal mal en effet, je les regarderai plus en détail demain, la jsuis naze, tro de taf aujourd'hui. merci, tchao

signaler à un administrateur
Commentaire de sivispacem le 06/04/2005 23:31:32

Une adresse de courriel (bal, email...) c'est compliqué.
De la forme :
<bal> = <partie-locale>@<domaine>
<partie-locale> = <chaîne-pointée> | <chaîne-quotée>
<chaîne-pointée> = <chaîne> | <chaîne>.<chaîne-pointée>
<chaîne-quotée>  =  "<texte>"
<texte> = \<x> | \<x><texte> | <uq> | <uq><texte>
<x> = tout caractère de l'ASCII (pas d'exceptions)
<uq> = tout caractère parmi les 128 caractères ASCII
       sauf <CR>, <LF>, quote ("), ou antislash (\)
<chaîne> = <char> | <char><chaîne>
<char> = 128 caractères ASCII sauf <special> or <SP>
<SP> = Le caractère Espace (ASCII code 32)
<special> = < > ( ) [ ] \ . , ; : @ " et les caractères de
            contrôle de l'ASCII (codes 0 à 31 inclus et 127)
<CRLF> = <CR><LF>
<CR> = Le caractère Retour Chariot (ASCII code 13)
<LF> = Le caractère Nouvelle Ligne (ASCII code 10)
<SP> = Le caractère Espace (ASCII code 32)

C'est le RFC  822 (Request For Comment)
voir http://jlr31130.free.fr/rfc822.html
pour la traduction en français
ou http://www.w3.org/Protocols/rfc822/ si tu préfère en
américain.

signaler à un administrateur
Commentaire de lordskyser1 le 07/04/2005 06:52:57

merci, c'est ce que je cherchais, j'arrive pas à comprendre tout ce qui se racontait dans la rfc originale quand j'avais été voir et la traduction avec google marchait pas. Je crois que jvai reprendre tes fonctions dans mon controle de formulaire car la mienne tient pas compte de toutes ces règles et je n'ai pas envi de réinventer la roue :-D En tout cas, merci pour les explications, tu devrais faire formateur.

signaler à un administrateur
Commentaire de Mimata le 17/01/2006 04:47:33

Bonjour,

J'utilise cette expression citée plus haut :
/^[a-zA-Z0-9]+((\.?|-?|_?)[a-zA-Z0-9]+)*@[a-z0-9]+([-_]?[a-z0-9]+)?(.[a-z0-9]{2,}){1,2}$/

Ca semble marcher mais si on met un . juste devant l'@, ça me fait planter le navigateur (IE et FF même tarif)...
Une idée quelqu'un ? Perso, je comprends pas grand chose à ces lignes.

signaler à un administrateur
Commentaire de sivispacem le 17/01/2006 13:00:29

Mimata, essaie
function EmailOK(sMail)
{
var re=/^[a-z\d]+((\.|-|_)[a-z\d]+)*@((?!-)[a-z\d-]{1,62}[a-z\d]\.){1,4}[a-z]{2,6}$/gi;
return (sMail.match(re)==sMail);
}

function DomainExtOK(sMail)
{
var tExt = new Array('ac','ad','ae','af','ag','ai','al','am','an','ao','aq','ar','as','at','au','aw','az','ba','bb','bd','be','bf','bg','bh','bi','bj','bm','bn','bo','br','bs','bt','bv','bw','by','bz','ca','cc','cd','cf','cg','ch','ci','ck','cl','cm','cn','co','cr','cs','cu','cv','cx','cy','cz','de','dj','dk','dm','do','dz','ec','ee','eg','eh','er','es','et','fi','fj','fk','fm','fo','fr','fx','ga','gb','gd','ge','gf','gg','gh','gi','gl','gm','gn','gp','gq','gr','gs','gt','gu','gw','gy','hk','hm','hn','hr','ht','hu','id','ie','il','im','in','io','iq','ir','is','it','je','jm','jo','jp','ke','kg','kh','ki','km','kn','kp','kr','kw','ky','kz','la','lb','lc','li','lk','lr','ls','lt','lu','lv','ly','ma','mc','md','mg','mh','mk','ml','mm','mn','mo','mp','mq','mr','ms','mt','mu','mv','mw','mx','my','mz','na','nc','ne','nf','ng','ni','nl','no','np','nr','nt','nu','nz','om','pa','pe','pf','pg','ph','pk','pl','pm','pn','pr','ps','pt','pw','py','qa','re','ro','ru','rw','sa','sb','sc','sd','se','sg','sh','si','sj','sk','sl','sm','sn','so','sr','st','su','sv','sy','sz','tc','td','tf','tg','th','tj','tk','tm','tn','to','tp','tr','tt','tv','tw','tz','ua','ug','uk','um','us','uy','uz','va','vc','ve','vg','vi','vn','vu','wf','ws','ye','yt','yu','za','zm','zr','zw','com','edu','gov','int','mil','net','org','biz','pro','info','aero','name','coop','arpa','nato','museum');
var Ext = sMail.substr(sMail.lastIndexOf(".") + 1).toLowerCase();
  for (var i=0; i<tExt.length; i++) {if (Ext==tExt[i]) {return true; }}
  return false;
}

function ValidEmail(sMail)
{
var sTrue = 'Email Correct !';
var sMailFalse = 'Erreur\nEmail incorrect !';
var sExtFalse = 'Erreur\nExtension incorrecte !';
  switch (EmailOK(sMail))
    {
    case true:
      return DomainExtOK(sMail) ? alert(sTrue) : alert(sExtFalse); break;
    case false:
      alert(sMailFalse); return false; break;
    }
}

ValidEmail(sMail) est la fonction d'entrée à modifier au choix...
A-Z n'est pas utile si tu met $/i pour "ignorer la casse"
et 0-9, c'est \d
le point d'interrogation n'est pas utile dans (\.?|-?|_?)
car si pas de point, de - ou de _, c'est une adresse [a-z\d]@
puisque [a-z\d](....)* le étoile prend la valeur "0".

Ces fonctions marchent avec firefox, Mozilla, IE sur
plateforme Windows, et Firefox, Mozilla, Epiphanie sur
Linux.

signaler à un administrateur
Commentaire de sivispacem le 17/01/2006 13:20:53

Mimata
Petite correction
var re=/^[a-z\d]+((\.|-|_)[a-z\d]+)*@((?!-)[a-z\d-]{0,62}[a-z\d]\.){1,4}[a-z]{2,6}$/gi;

1,62 remplacé par 0,62 pour un nom de domaine
min x.TLD à x(63).TLD

Les TLD (Top Level Domain) sont de 2 à 5 pour museum
les 2 caractères sont les pays. Bientôt, il ne faudra pas
oublier de rajouter le .eu dans la liste(Array('ac'....... 'eu')

signaler à un administrateur
Commentaire de Melnofil le 18/01/2006 11:41:43

Je vous préviens que la source à été modifiée depuis hier.

sivispacem,
partant du principe que le code javascript est long a s'executer
(je parle de ta boucle sur le tableau des extensions)
je me demande s'il serait pas plus rapide de tester directement une RegExp du style :
"([a-z]{2}|com|edu|gov|int|mil|net|org|biz|pro|info|aero|name|coop|arpa|nato|museum)"
.. Je te passe les 3km d'extensions sur 2 lettres ;^)

signaler à un administrateur
Commentaire de sivispacem le 18/01/2006 13:33:18

Voila effectivement ce que j'utilise :
//-----------------------------------------------------------------
function bDomainTLD(sMail)
{
var reExt=/^(ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|
az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|
ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|de|
dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|fx|
ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|
hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|
kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|
ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|
my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|pa|pe|pf|pg|
ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|
sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|
tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|
ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zr|zw|com|edu|gov|int|mil|
net|org|biz|pro|info|aero|name|coop|arpa|nato|museum)$/gi;
return sMail.substr(sMail.lastIndexOf(".") + 1).match(reExt)!=null;
}
//-----------------------------------------------------------------
Attention, j'ai mis des retour chariot dans "var reExt" pour
la lisibilité, mais c'est une seule ligne jusqu'à "|museum)$/gi;"
Et puis j'ai ajouté les ".eu" pas encore actifs à cette date.
Donc une seule variable et renvoie d'un booléen d'où le nom
de la fonction (b) Domain (Top Level Domain).
On lui passe l'adresse de courriel en entier (xxxxx@xxxxx.tld).
Des critiques ?

signaler à un administrateur
Commentaire de Mimata le 18/01/2006 15:22:55

Bonjour,

Merci pour tes explications Sivispacem, j'ai repris ce que tu m'avais indiqué
et ça marche bien maintenant, plus de plantage donc c'est OK.
Par contre, j'ai pas utilisé pa boucle pour vérifier l'extention...ça me parait un peu trop lourd
pour l'utilisation que j'ai à en faire mais c'est tout de même intéressant de l'avoir créée.

J'ai donc une fonction qui vérifie le mail de mon champs "mail" de mon formulaire "formulaire"
lors de la soumission de ce dernier :

function verif_mail() {
var champsok=""; // Couleur des champs correctement remplis
var champspasok="#FF6500"; // Couleur des champs mal remplis
var email = document.forms['formulaire'].mail.value;
var verif   = /^[a-z\d]+((\.|-|_)[a-z\d]+)*@((?!-)[a-z\d-]{0,62}[a-z\d]\.){1,4}[a-z]{2,6}$/gi;
if (mail.value.length!==0) {
if (verif.exec(email) == null) {
alert("Votre mail est incorrect. Veuillez vérifier.");
mail.focus();
mail.style.backgroundColor=champspasok;
return false;
}
}
else {mail.style.backgroundColor=champsok;}
}

A cette fonction, j'ai couplé une autre fonction qui désactive les caractères accentués
et autres caractères invalides dans une mail lors de l'écriture du mail :

function valid_mail(evt) {
var keyCode = evt.which ? evt.which : evt.keyCode;
var interdit = 'àâäãçéèêëìîïòôöõùûüñ &*?!:;,\t#~"^¨%$£?²¤§%*()[]{}<>|\\/`\'';
if (interdit.indexOf(String.fromCharCode(keyCode)) >= 0) {
return false;
}
}

Sinon, j'ai une question : un mail peut contenir des majuscules ?
Enfin plus précisément, est-ce que les mails sont sensibles à la casse ?

signaler à un administrateur
Commentaire de sivispacem le 18/01/2006 16:55:31

Mimata,
mail.value.length!==0 ça ne sert à rien,
et c'est bizarre (!==) ???

Fais simplement
if(bal.match(verif)!=bal)
{
  alert("Votre mail est incorrect. Veuillez vérifier.");
  mail.focus();
  mail.style.backgroundColor=champspasok;
  return false;
}

Cela n'accepte pas les mails vides

La casse est ignorée dans les mails
voila pourquoi le "$/gi" à la fin de l'expression régulière,
"i" signifie d'ignorer la casse. C'est un masque sur le sixième
bit de l'octet (min, MAJ en le basculant)
A 01000001 Z 01011010
a 01100001 z 01111010
(00?00000) (00?00000)
donc [a-zA-Z] sans le "$/i"
ou [a-z] avec "$/i" plus court.

signaler à un administrateur
Commentaire de Mimata le 18/01/2006 18:04:44

Sivispacem

Le mail.value.length!=0 (correction faite du ==) me sert car le mail n'est pas obligatoire,
je ne veux tester la validité du mail que si le champs mail est renseigné.

Mon code final :

var email = document.forms['formulaire'].mail.value;
var verif   = /^[a-z\d]+((\.|-|_)[a-z\d]+)*@((?!-)[a-z\d-]{0,62}[a-z\d]\.){1,4}[a-z]{2,6}$/gi;
if (mail.value.length!=0) {
if(bal.match(verif)!=bal) {
alert("Votre mail est incorrect. Veuillez vérifier si vous voulez que je puisse vous réponde.");
mail.focus();
mail.style.backgroundColor=champspasok;
return false;
}
}
else {mail.style.backgroundColor=champsok;}

Pour ma deuxième fonction j'ai un petit soucis aussi : les flèches de déplacement du curseur,
la tabulation et suppr. sont désactivés aussi, sais-tu pourquoi ?

signaler à un administrateur
Commentaire de sivispacem le 18/01/2006 21:30:24

Normal, tu intercepte le tampon clavier sur
un champ vide (pas de déplacement), la tabulation
tu l'interdit (\t) elle est donc supprimée, et
suppr sur rien ne veux rien dire ou doit marcher
à gauche d'un caractère existant(mais cela dépend).

Internet Explorer ne connaît le code de la touche que
dans la propriété keyCode et ne traite pas les touches
spéciales (entrée, tabulation, del, suppr, ...)
Netscape connaît le code par la propriété which dans toutes
ses versions et ne traite pas les touches spéciales (entrée,
tabulation, del, suppr, ...)
Mais, mieux que mon baratin, vas voir
http://actuel.fr.selfhtml.org/articles/javascript/entrees_formulaire/
pour les bizarreries des navigateurs et les bons scripts.
Site sérieux !
Mais le sujet est déplacé ici !
Il doit y avoir d'autre posts !

signaler à un administrateur
Commentaire de Mimata le 19/01/2006 00:04:20

Sivispacem, je te remercie pour ce petit cours particulier et pour les explications très claire, complètes
que tu m'a données. J'ai appris plein de choses au cours de ce post et j'en suis ravis !

Toutefois, j'ai remis if (verif.exec(email) == null) à la place de if(bal.match(verif)!=bal) sinon ça ne marchait plus
avec les geckos (FF & Co) et j'ai enlevé \t ce qui réactive bien suppr mais pas les tab ni les flèches (sous FF).

- Tout semble fonctionner sous IE et Opéra, tab, flèche, suppr et test
- Sous Firefox, Netscape et Mozilla : pas de tabulation ni de flèches. Le formulaire reste fonctionnel si on a une souris
mais pour une navigation au clavier, je coince mon visiteur dans le champs mail...pas très accessible...

Voilà, encore merci.

signaler à un administrateur
Commentaire de sivispacem le 19/01/2006 01:01:47

Une modif pour les noms de domaines et être conforme
à la RFC 1034 (voir)
Résumé : Notez que, bien que tant les majuscules que les minuscules soient
autorisées dans des noms de domaines, aucune importance n'est accordée
à la casse. C'est-à-dire, deux noms lexicographiquement identiques, mais
écrit dans une casse différente seront considérés comme identiques.
Les identifiants doivent suivre les règles définies pour les noms
d'hôtes ARPANET. Ils doivent commencer par une lettre, terminer par
une lettre ou un digit, et n'avoir à l'intérieur que des lettres,
des digits, et éventuellement le caractère Hyphénation (-).
On notera de plus quelques restrictions à propos de la longueur.
Un identifiant doit avoir au plus 63 caractères.

Donc je code le domaine comme suit :
@([a-z][a-z\d-]{0,61}[a-z]\.){1,4}[a-z]{2,6}$/gi
Et on est conforme !

Il restera les @[octet.octet.octet.octet]
et les @#nombre  (nombre = adresse IP décimale (32 bits))
de 167772161 (10.0.0.1) à 3741319422 (223.0.0.254)
de la Classe A à la Classe C, avec quelque addresses à
éliminer (genre 11.812.785.999)...
Mais ce type d'adresse me semble inusité, sans compter les
ennuis pour s'en souvenir !
Quelqu'un à vérifié une adresse de ce type qui fonctionne ?

signaler à un administrateur
Commentaire de sivispacem le 19/01/2006 01:03:32

Excusez j'ai oublié la RFC 1034 en français :
http://abcdrfc.free.fr/rfc-vf/rfc1034.html

signaler à un administrateur
Commentaire de sivispacem le 19/01/2006 01:16:12

Oups pour les "digits" à la fin et 1 seul caractère !

notez : @([a-z][a-z\d-]{0,62}(?!-)\.){1,4}[a-z]{2,6}$/gi

@x.xx à @x[63].xxxxxx et @-.xx et @xxxx-.xx interdits.
La répétition et de 1 minimum pour les identifiants
à 4 (arbitraire) car au total le max est 255 avant le TLD.

signaler à un administrateur
Commentaire de sivispacem le 19/01/2006 01:45:24

Mimata
Code en universel :
function bSyntaxeEmail(sMail) {... renvoie un booléen}
function bDomainTLD(sMail) {... renvoie un booléen}
etc... (true ou false)
Tes fonctions seront réutilisables en bibliothèques,
sans tripotages pour passer d'une langue à une autre
ni pour modifier l'apparence, etc
Et une fontion d'entrée personnalisable pour ta cuisine
(genre function TestCompletDuCourriel(sMail))
(langues, actions, présentation et bidouillages à faire
varier suivant les formulaires).
Tu sera gagnant avec le temps.

Et appel ton javascript avec this.form.NOMDELAVARIABLE.value
Du genre
<form>
<input type="text" name="Email" value size="80">
<input type="button" value="Teste E-Mail" onclick="TestCompletDuCourriel(this.form.Email.value);">
</form>
au lieu de chercher la valeur avec
var email = document.forms['formulaire'].mail.value;
(une variable de plus, et le nom du formulaire source d'erreur !)

signaler à un administrateur
Commentaire de Mimata le 19/01/2006 13:00:44

Oh oh ! Doucement tornado !!! Je suis largué moi ;-D
J'ai 3 semaines de javascript et 3 jours d'expressions régulières
alors les bibliothèques, cuisines et autre mobilier... je sais même pas ce que c'est.
J'ai aussi regardé la norme RFC 1034 mais j'ai pas pané grand chose non plus. Bref, y'a du boulot.

Bon, pour être plus concret, mon formulaire est visible là :
http://xhtml.css.free.fr/contact.htm et le javascript associé là : http://xhtml.css.free.fr/_JS/formulaire.js.
Le but du jeu étant de rester valide en XHTML1.0 Strict.

Je comprends pas bien pourquoi on a besoin de x fonctions pour tester le mail
et je ne sais pas utiliser les paramètre (c'est pour ça tu vas me dire).
On peut pas tout mettre dans ma fonction verifier() ? J'ai pas envie d'appeler 50 fonctions juste pour tester 1 champs...

signaler à un administrateur
Commentaire de Melnofil le 19/01/2006 13:34:20

sivispacem au lieu de troller sur ma source LoL
(Surtout que le site s'y met aussi dans ma messagerie en envoyant un email par message !!)
Actuellement il est très difficile de faire la synthèse de tes posts sans se mélanger les pinceaux,
alors pourquoi tu nous ferais pas un tutorial complet
rassemblant toutes tes connaissances sur la validation des emails !
Et tu nous organise tout ca en chapitres histoire qu'on s'y retrouve ;^)
puis tu fais un lien vers ton tuto d'ici !

En plus la validation d'email n'est pas liée au javascript en particulier,
tu pourrais écrire un tutorial plus général
pour tous les languages utilisant les mêmes expressions régulières.

Ceci étant dit je t'oblige en rien si tu veux continuer a poster ici, fait donc =)
++ Melnofil

signaler à un administrateur
Commentaire de sivispacem le 19/01/2006 21:18:47

OK, allez voir
http://www.javascriptfr.com/code.aspx?ID=35656
J'hésitais car le sujet est largement débattu.
Mais le problème n'est pas si simple !
Pour les autres languages, simple, il faut
reprendre les expressions régulières.
Mais je parlais aussi d'isoler les fonctions pour
pouvoir les utiliser dans des pages en français, anglais
bania moulengué et kikoutou entre autre... en
ne modifiant que la fonction d'entrée.

signaler à un administrateur
Commentaire de sivispacem le 20/01/2006 00:03:30

Melnofil
Petit commentaire pour ton Historique des mises à jour
du 17/01/2006 12:52:15
Tu dis "(attention comme pour la RFC il n'y a pas de taille maximale pour les "mots"
et donc pour l'extension de l'email)"
C'est pas très correct. La RFC sur les email se reporte à celle
sur les noms de domaine pour préciser.
1 identifiant (<identifiant>.<identifiant>) est limité à
63 caractères Max, La somme des identifiants à 255 caratères (octets).
Les TLDs, de fait, à 2 Min et 6 Max ([a-z]{2,6}).
Ainsi <identifiant>.<identifiant>.  ...  .tld fait max 255 caractères.
Et l'on doit semble t'il compter les points.
Je cite : "le nombre total d'octets composant un nom de domaine entièrement qualifié
(c'est à dire la somme de tous les identifiants plus la mention
des longueurs d'identifiants) est limité à 255."
javascriptfr.com c'est 16 caractères notés dans les DNS.
Dans mon expression @((?![-\d])[a-z\d-]{0,62}[a-z\d]\.){1,4}[a-z]{2,6}
si je ne m'abuse avec 4 identifiants de 63 + les points = 256
et un .fr minimum fait 259 et c'est une erreur !
http://abcdrfc.free.fr/rfc-vf/rfc1034.html paragraphe 3
C'est la limitation des serveurs DNS (bind, etc).
Se rappeler
- 63 octets par identifiant
- 255 octets par nom de domaine entièrement qualifié (FQDN)
Je me trompe ? C'est en tout cas la limitation de mon serveur DNS local !

Ajouter un commentaire