Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Téléchargez
Téléchargez Récupérez et commentez les sources et outils mis à disposition par la rubrique Perl
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 31/05/2011, 01h34   #1
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 487
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 487
Points : 31 589
Points : 31 589
Par défaut Comment tester la validité d'une adresse électronique ?

Bonjour,

Je vous propose un nouvel élément à utiliser : Comment tester la validité d'une adresse électronique ?

Pour tester la validité d'une adresse électronique, inutile de s'acharner à trouver la bonne expression régulière. Il existe des modules perl le faisant pour nous proprement.



Voici un exemple de codes utilisant des modules différents Email::Valid et Mail::CheckUser.

Qu'en pensez-vous ?
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 09h59   #2
Jasmine80
Membre Expert
 
Avatar de Jasmine80
 
Jasmine
Inscription : octobre 2006
Messages : 2 924
Détails du profil
Informations personnelles :
Nom : Jasmine
Âge : 33
Localisation : Belgique

Informations forums :
Inscription : octobre 2006
Messages : 2 924
Points : 2 145
Points : 2 145
Coucou,


La fonction 'recherche avancée' m'a une fois de plus bien servie.

Quand il s'agit de récupérer des milliers d'adresses électroniques noyées dans un fichier texte, une regexp est-il utile? Elles sont valides, il ne faut pas le vérifier, simplement les extraire.

style
Code :
if($line =~ m/([a-z_\-.0-9]+@[a-z_\-.0-9]+)/i)
ou en plus court

Code :
if($line =~ m/([\w\-\.]+@[\w\-\.]+)/)

petite curiosité trouvée au hasard sur le net :

Citation:
le regexp d'un mail est assez compliquer, pour valider si le mail est bon ca donne ca :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
/^((\\\"[^\\\"\\f\\n\\r\\t\\b]+\\\" )|([A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\
\+\\-\\~\\/\\^\\`\\|\\{\\}]+(\\.[A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\
~\\/\\^\\`\\|\\{\\}]*)*))@((\\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0
-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-
4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0
-9])))\\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(
2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9
]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9
])(([A-Za-z0-9\\-])*([A-Za-z0-9]))?(\\.(?=[A-Za-z0-9]))?)+[A-Za-z\\-]*))
$/D
... je suppose que c'est à ce code barbare, que je ne comprends d'ailleurs pas, que tu fais allusion en disant 'Pour tester la validité d'une adresse électronique, inutile de s'acharner à trouver la bonne expression régulière.'


Merci
__________________
-- Jasmine --

Merci de poser les questions dans le forum, je ne répondrai pas aux MP.
Jasmine80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 10h53   #3
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 487
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 487
Points : 31 589
Points : 31 589
Citation:
Envoyé par Jasmine80 Voir le message
petite curiosité trouvée au hasard sur le net :


Code :
1
2
3
4
5
6
7
8
9
10
11
 
/^((\\\"[^\\\"\\f\\n\\r\\t\\b]+\\\" )|([A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\
\+\\-\\~\\/\\^\\`\\|\\{\\}]+(\\.[A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\
~\\/\\^\\`\\|\\{\\}]*)*))@((\\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0
-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-
4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0
-9])))\\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(
2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9
]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9
])(([A-Za-z0-9\\-])*([A-Za-z0-9]))?(\\.(?=[A-Za-z0-9]))?)+[A-Za-z\\-]*))
$/D
... je suppose que c'est à ce code barbare, que je ne comprends d'ailleurs pas, que tu fais allusion en disant 'Pour tester la validité d'une adresse électronique, inutile de s'acharner à trouver la bonne expression régulière.'

Merci
Tout à fait .

Pour ton code où tu ne souhaites qu'extraire les adresses emails, il y a surement un module nous permettant d'avoir le bon pattern pour la regex, il faut juste chercher sur le CPAN. Si je le retrouve, je te le mentionne ici et on pourrait le rajouter dans les sources.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 11h04   #4
Jasmine80
Membre Expert
 
Avatar de Jasmine80
 
Jasmine
Inscription : octobre 2006
Messages : 2 924
Détails du profil
Informations personnelles :
Nom : Jasmine
Âge : 33
Localisation : Belgique

Informations forums :
Inscription : octobre 2006
Messages : 2 924
Points : 2 145
Points : 2 145
Voici mon code terminé qui fonctionne parfaitement (jusqu'à preuve du contraire) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/local/bin/perl
 
 
use strict;
use warnings;
 
use List::Compare;
 
 
# chemin vers les fichiers
my $file_path1 = 'P:/Theorie/Driss/adresses_mail/New_Yeast_2011.txt';
my $file_path2 = 'P:/Theorie/Driss/adresses_mail/retour_yeast_email_format.txt';
 
 
# récupérér l'entiereté du premier fichier dans une variable $file_content1
open my($file1), '<', $file_path1
  or die "Can't open $file_path1 : $!\n";
my $file_content1 = do { local $/; <$file1> };
close $file1;
 
# récupérér l'entiereté du second fichier dans une variable $file_content2
open my($file2), '<', $file_path2
  or die "Can't open $file_path2 : $!\n";
my $file_content2 = do { local $/; <$file2> };
close $file2;
 
# récupération des adresses électroniques dans deux listes @mail_list1 et @mail_list2
my @mail_list1 = $file_content1 =~ m/([\w\-\.]+@[\w\-\.]+)/g;
my @mail_list2 = $file_content2 =~ m/([\w\-\.]+@[\w\-\.]+)/g;
 
# suppression des adresses électroniques doubles
@mail_list1 = &supprime_doublon(\@mail_list1 );
@mail_list2 = &supprime_doublon(\@mail_list2 );
 
# affichage du nombre d'adresses uniques pour chaque liste
print "mail_list1 : ".@mail_list1."\n";
print "mail_list2 : ".@mail_list2."\n";
 
# création d'une comparaison de listes avec le module List::Compare
my $lc = List::Compare->new(\@mail_list1 , \@mail_list2);
 
# recherche des adresses n'apparaissant que dans la première liste
my @Lonly = $lc->get_unique;
 
print "adresses de New Yeast 2011.xls sans celles de Retour yeast email.txt  : ".@Lonly."\n";
 
print (join "\n", @Lonly);
print "'\n\n";
 
 
 
 
 
sub supprime_doublon{
        my $self=shift;
        my %saw;
        my @result = @$self;	   #deréférence le tableau, donc on le récupère et le copie dans @result
  			           #pour eviter de travailler sur le tableau d'origine et le modifier.
        undef %saw;
        @saw{@result} = ();	   #chaque case de @result est mis en clef dans %saw avec une valeur nulle. et comme un
        @result = sort keys %saw;  #hash n'a pas deux clefs identiques, redondances supprimées.
        return(@result);
}

... je ne dis pas qu'il est optimal au niveau temps d'exécution mais ça me suffit largement.

Citation:
Envoyé par Djibril
il y a surement un module nous permettant d'avoir le bon pattern pour la regex, il faut juste chercher sur le CPAN
Pourquoi faire simple si il y a compliqué ... heuh non, l'inverse

N'est-ce pas amplement suffisant :
Code :
my @mail_list1 = $file_content1 =~ m/([\w\-\.]+@[\w\-\.]+)/g;

nb : le sous-programme supprime_doublon, je le dois à Jedaï ... merci encore à lui, ça me sert tout le temps.


EDIT ; un grand merci à Djibril pour son sous-programme supprime_doublon
__________________
-- Jasmine --

Merci de poser les questions dans le forum, je ne répondrai pas aux MP.
Jasmine80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 12h01   #5
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 487
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 487
Points : 31 589
Points : 31 589
supprime_doublon c'est ma procédure mais de toute façon, jedai aurait été capable de la faire également . Quant à ta regex, si elle te suffit, pas besoin de se compliquer la vie .
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 12h23   #6
Jasmine80
Membre Expert
 
Avatar de Jasmine80
 
Jasmine
Inscription : octobre 2006
Messages : 2 924
Détails du profil
Informations personnelles :
Nom : Jasmine
Âge : 33
Localisation : Belgique

Informations forums :
Inscription : octobre 2006
Messages : 2 924
Points : 2 145
Points : 2 145
Citation:
Envoyé par djibril Voir le message
supprime_doublon c'est ma procédure

désolée pour cette méprise bisous pour te consoler
__________________
-- Jasmine --

Merci de poser les questions dans le forum, je ne répondrai pas aux MP.
Jasmine80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 14h37   #7
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 487
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 487
Points : 31 589
Points : 31 589
Le module est Email::Find.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 14h54   #8
Jasmine80
Membre Expert
 
Avatar de Jasmine80
 
Jasmine
Inscription : octobre 2006
Messages : 2 924
Détails du profil
Informations personnelles :
Nom : Jasmine
Âge : 33
Localisation : Belgique

Informations forums :
Inscription : octobre 2006
Messages : 2 924
Points : 2 145
Points : 2 145
Citation:
Envoyé par djibril Voir le message
Le module est Email::Find.
C'est tout à fait cela, merci.
__________________
-- Jasmine --

Merci de poser les questions dans le forum, je ne répondrai pas aux MP.
Jasmine80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 14h58   #9
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 487
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 487
Points : 31 589
Points : 31 589
Je vais rajouter un programme dans nos sources à télécharger.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h00.


 
 
 
 
Partenaires

Hébergement Web