CONTRÔLER LA SAISIE D'UN E-MAIL

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 23 janv. 2007 à 12:41
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 - 13 mai 2008 à 19:04
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41227-controler-la-saisie-d-un-e-mail

cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
13 mai 2008 à 19:04
par expression réguliére on peut faire comme ceci :
( code en .NET )
Imports System.Text.RegularExpressions
Module Validation
Const AutorizedMailCharPattern = "[a-z0-9_]";
Const ValidMailPattern = "^#+(\.#+)*@#+(\.#+)*?\.#{2,4}$";
Dim RX_MailCheck As New Regex(ValidMailPattern.Replace("#",AutorizedMailCharPattern,RegexOptions.Compiled Or RegexOptions.IgnoreCase));

Function IsEmailValid(Email As String) As Boolean
Return RX_MailCheck.IsMatch(Email);
End Function

End Module

Je suis désolé de présenté se code en .Net, toutefois je suis persuadé que les expressions réguliéres existe en VB et la syntaxe doit être sufisement proche pour que l'exemple soit retenu.

On voit d'emblé que le code est bien plus simple que les codes sans expression réguliére, il est aussi trés rapide (en fait il pourais bien être plus rapide que le code sans expression réguliére, il prend de nombreux cas en compte dont certain ne sont pas envisagé dans les codes précédent.

Je post ceci afin de popularisé un peu les expressions réguliéres, certains les connaissent trés bien mais beaucoup ignore tout de leur puissance, elles sont pourtant un outil incontournable dans la validation de données...
andalo Messages postés 102 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 octobre 2012
13 mai 2008 à 14:33
en effet, on doit aimer se compliquer la vie, merci pour l'aide.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 mai 2008 à 12:22
False, valeur par default de la variable automatique, crée puor stocker le retour de la fonction. elle ne conserve pas sa valeur d'un appel a l'autre (même si appels recursifs)

pos_arobase2 inutile... fais un If Instr...
andalo Messages postés 102 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 octobre 2012
13 mai 2008 à 12:17
ok, j'ai pris en compte tout ca. une question tout de même, false est la valeur par defaut d'une fonction, même si je me suis au prealable servi de la fonction et qu'elle a retourné true?, si je m'en ressert ensuite, j'imagine donc qu'elle est reinitialisé a false automatiquement?
sinon j'ai aussi corrigé une petite erreur dans la dernière condition.

Function mailvalide(email) As Boolean
Const CarAutorise = "abcdefghijklmnopqrstuvwxyz0123456789.@"
Dim i As Integer, pos_point As Integer, pos_point2 As Integer, pos_arobase As Integer, pos_arobase2 As Integer
If Len(email) < 6 Or IsNull(email) Then Exit Function 'si longueur de chaine invalide, on sort de la fonction
If InStr(1, email, ".@") Or InStr(1, email, "@.") Then Exit Function 'si .@ ou @. est présent, on sort de la fonction
pos_arobase = InStr(1, email, "@")

If pos_arobase < 2 Then
Exit Function 'si arobase inexistant ou en premier caractère, on sort de la fonction
Else
pos_arobase2 = InStr(pos_arobase + 1, email, "@")
If pos_arobase2 > 0 Then Exit Function 'si un deuxieme arobase est trouvé on sort de la fonction
End If

pos_point = InStr(pos_arobase + 1, email, ".")
If pos_point < pos_arobase Then Exit Function 'si il n'y a pas de point apres l'arobase, on sort de la fonction
If Right(email, 1) "." Or Right(email, 1) "@" Then Exit Function ' si @ ou . en derniere position, on sort
If InStr(pos_arobase, email, "..") > 0 Then Exit Function 'si .. present apres @ on sort de la fonction
i = 0
For i = 1 To Len(email)
If InStr(1, CarAutorise, Mid(email, i, 1), vbTextCompare) < 1 Then
Exit Function 'si on trouve autre chose qu'un caractère autorisé, on sort de la fonction
End If
Next
mailvalide = True 'si on est pas sortie avant, c'est que l'adresse mail est valide
End Function
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 mai 2008 à 10:38
Dim pos_point, pos_point2, pos_arobase, pos_arobase2 As Integer
pos_point, pos_point2, pos_arobase sont des Variant, ici

mailvalide = False
pas besoin d'initialiser, c'est la valeur par defaut d'un boolean

i est non déclaré (pense a jouer avec Option Explicit)

Mid(email, Len(email), 1) => fonction Right

InStr(1, CarAutorise, LCase(Mid(email, i, 1)))
pas de LCase a faire dans ce genre de choses... Instr permet de spécifier vbTextCompare comme dernier argument
andalo Messages postés 102 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 octobre 2012
13 mai 2008 à 10:18
desolé, j'essayais de voir si le html pouvais me coloriser le code pour poster ici.
Donc voila, j'ai essayé cette fonction qui me renvoi systematiquement ques mes emails sont invalides, alors je m'en suis inspiré, pour ecrire le code qui suit, à mon sens c'est plus rapide et du coup plus complet vu que j'ai rajouté des choses en rapport aux commentaires de Malkhut. J'espère ne pas avoir trop dérogé aux regles pour poster ici et coder du vb!


Function mailvalide(email) As Boolean
Const CarAutorise = "abcdefghijklmnopqrstuvwxyz0123456789.@"
Dim pos_point, pos_point2, pos_arobase, pos_arobase2 As Integer
mailvalide = False

If Len(email) < 6 Or IsNull(email) Then Exit Function 'si longueur de chaine invalide, on sort de la fonction
If InStr(1, email, ".@") Or InStr(1, email, "@.") Then Exit Function 'si .@ ou @. est présent, on sort de la fonction
pos_arobase = InStr(1, email, "@")

If pos_arobase < 2 Then
Exit Function 'si arobase inexistant ou en premier caractère, on sort de la fonction
Else
pos_arobase2 = InStr(pos_arobase + 1, email, "@")
If pos_arobase2 > 0 Then Exit Function 'si un deuxieme arobase est trouvé on sort de la fonction
End If

pos_point = InStr(pos_arobase + 1, email, ".")
If pos_point < pos_arobase Then Exit Function 'si il n'y a pas de point apres l'arobase, on sort de la fonction
If Mid(email, Len(email), 1) "." Or Mid(email, Len(email), 1) "@" Then Exit Function
If InStr(pos_arobase, email, "..") > 0 Then Exit Function 'si .. present apres @ on sort de la fonction
For i = 1 To Len(email)
If InStr(1, CarAutorise, LCase(Mid(email, i, 1))) < 0 Then
Exit Function 'si on trouve autre chose qu'un caractère autorisé, on sort de la fonction
End If
Next
mailvalide = True 'si on est pas sortie avant, c'est que l'adresse mail est valide
End Function
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
24 janv. 2007 à 17:53
encore moi !

ne déclare pas comme ca :


Dim TestAdrMail As Boolean, TestAccents, TestCarInterdits As Boolean
Dim i As Integer
Dim pos_point, pos_point2, pos_arobase, pos_arobase2 As Integer

celà équivaut à :

Dim TestAdrMail As Boolean, TestAccents As Variant, TestCarInterdits As Boolean
Dim i As Integer
Dim pos_point As Variant, pos_point2 As Variant, pos_arobase As Variant, pos_arobase2 As Integer

donc déclare :

Dim TestAdrMail As Boolean, TestAccents As Boolean, TestCarInterdits As Boolean
Dim i As Integer
Dim pos_point As Integer, pos_point2 As Integer, pos_arobase As Integer, pos_arobase2 As Integer

La vérification de .@ et @. est défailante,

que se passe-t'il avec cette adresse : Toto.tata..tom.@.poto..c

A mon sens Accent et interdit devrais être traiter ensemble (une seul boucle donc plus rapide
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
24 janv. 2007 à 17:42
Pour allonger la liste des test :

pas de point a la fin
pas de @ a la fin
au moins 6 caractères(mail mini -> a@a.aa
au moins un point aprés le @
pas de PointPoint dans la partie dériére le @
La derniére partie de l'email (aprés le derniér points) doit contenir 2 à 4 carateres.

consernat la partir Utilisateur de l'email(avant le @) il y'a des régles a suivre mais dans la pratique il arrive que certaine implémentation déroge à la régle donc méfiance(certain serveur accepte les noms commencant par point...).
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
24 janv. 2007 à 17:32
A mon avis il serait plus judicieux de travailler a partir des caractères autorisé(que ce passe t'il si un ° ou un ? se glisse dans l'adresse...)

dans ce cas une liste de caractères autorisé est plus simple a metre en place, parce que les chaines coddée en unicode peuvent contenir trop de caractere interdits pour tous les enuméré (cyrilique,arabes,accent,ponctuation,symbole mathématique...)

sinon une expression réguliére fais tous ca et même plus en une seul fonction. Si tu ne les connais pas renseigne toi c'est un peu chiant au départ mais question validation de données y'a pas mieux.
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
23 janv. 2007 à 18:25
Moui, de toutes façons ces fonctions ont très peu d'utilités...
Si j'entre x@x.x , ça va matcher donc voilà, ...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 janv. 2007 à 12:41
Tu ^pourrais également utiliser une 'expression rationelle' (Regular expression)
Rejoignez-nous