Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]5991[/thread]

Regulärer Ausdruck für Mail-Adressen

Leser: 1


<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
Gast Gast
 2004-12-30 22:23
#77648 #77648
Hi Leute,
also, ich suche den "perfekten" regulären Ausdruck zum suchen einer e-Mail Adresse. Mein bisheriger Ausdruck lautet so:
Code: (dl )
m/\w+@.*?\.\w{2,}/g;

sprich: ein oder mehrere Wörter, gefolgt von einem "@", gefolgt von 0 oder mehreren Zeichen, gefolgt von einem ".", gefolgt von einem Wort mit 2 oder mehr Buchstaben (sprich de, com, uk, pl, ...).
Allerdings finde ich so keine Mail-Adressen mit einem "-" oder so.
Verwende ich nun ".*?", also ein beliebiges Zeichen 0,1 oder mehrmals, klemmt mein Skript (rechnet ewig bzw. endet nie):
Code: (dl )
m/.+?@.+\.\w{2,}/g;

Den HTML-Parser möchte ich nicht verwenden, da es auch so funktionieren muss, ich kann die Mail-Adressen nur leider nicht allgemein genug formulieren!
Vielleicht habt Ihr eine Idee oder bereits eine Lösung ;)
Danke!!

...und einen guten Rutsch ;)
esskar
 2004-12-30 22:26
#77649 #77649
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ich benutze dafür immer Mail::Address + folgende Erweiterung:

Code: (dl )
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package Sources::Address;

use strict;
use warnings;

use Mail::Address;


use vars qw(@ISA);

@ISA = qw( Mail::Address );

sub _extract_name
{
local $_ = shift || '';

# Bug in unicode \U, perl 5.8.0 breaks when casing utf8 in regex
if($] eq 5.008)
{ require utf8;
eval 'utf8::downgrade($_)';
}

# trim whitespace
s/^\s+//;
s/\s+$//;
s/\s+/ /;

# Disregard numeric names (e.g. [EMAIL=123456.1234@compuserve.com]123456.1234@compuserve.com[/EMAIL])
return "" if /^[\d ]+$/;

# remove outermost parenthesis
s/^\(|\)$//g;

# remove outer quotation marks
s/^"|"$//g;

# remove embedded comments
# s/[^\\]\(.*[^\\]\)//g;
s/^\s*\(((?:[^)\\]+|\\.)*)\)//;

# remove quotes
s/\\(.)/$1/g;

# reverse "Last, First M." if applicable
s/^([^\s]+) ?, ?(.*)$/$2 $1/;
s/,.*//;

# Set the case of the name to first char upper rest lower
# Upcase first letter on name
s/\b([a-zA-ZäüöÄÜÖß]+)/\L\u$1/igo;

# Scottish names such as 'McLeod'
s/\bMc([a-zA-ZäüöÄÜÖß])/Mc\u$1/igo;

# Irish names such as 'O'Malley, O'Reilly'
s/\bo'([a-zA-ZäüöÄÜÖß])/O'\u$1/igo;

# Roman numerals, eg 'Level III Support'
s/\b(x*(ix)?v*(iv)?i*)\b/\U$1/igo;

# some cleanup
s/\[[^\]]*\]//g;
s/(^[\s'"]+|[\s'"]+$)//g;
s/\s{2,}/ /g;

return $_;
}

sub name
{
my $me = shift;
my $phrase = $me->phrase;
my $addr = $me->address;

$phrase = $me->comment unless(defined($phrase) && length($phrase));

my $name = _extract_name($phrase);

# first.last@domain address
if($name eq '' && $addr =~ /([^\%\.\@_]+([\._][^\%\.\@_]+)+)[\@\%]/o)
{
($name = $1) =~ s/[\._]+/ /go;
$name = _extract_name($name);
}

if($name eq '' && $addr =~ m#/g=#oi)
# X400 style address
{
my ($f) = $addr =~ m#g=([^/]*)#oi;
my ($l) = $addr =~ m#s=([^/]*)#io;

$name = _extract_name($f . " " . $l);
}

return length($name) ? $name : undef;
}

1;


für hilfe, schau dir die Mail:Address doku an;
renee
 2004-12-30 22:29
#77650 #77650
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dafür gibt es dieses Modul: Mail::RFC822::Address
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
anti
 2004-12-30 22:46
#77651 #77651
User since
2003-11-29
155 Artikel
BenutzerIn
[default_avatar]
Danke für die schnellen Antworten, nur leider komme ich damit nicht so recht klar *schäm*.
Ich habe ein html-Dokument in einem String gespeichert: Wie kann ich daraus alle Mail-Adressen auslesen?
Mit einem einfachen Regulären Ausdruck scheint es ja nicht zu gehen, oder?!?
Ich dachte, ich kann einfach den gesamten String nach meinem Regulären Ausdruck "irgendwas@irgendwas.domain" durchsuchen - aber irgendwie sind Mail-Adressen doch komplizierter als ich dachte :(.
renee
 2004-12-30 23:27
#77652 #77652
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
dann such doch erstmal die E-Mail-Adresse raus und überprüf diese dann separat mit einem der Module
Code: (dl )
1
2
3
my $string = '<html> [EMAIL=email@adresse.tld]email@adresse.tld[/EMAIL] </html>';
my (@emails) = $string =~ m/([\s]+\@[^\s]+)/g;
# jetzt adressen überprüfen
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
[E|B]
 2004-12-31 00:44
#77653 #77653
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Mail::Verify ist auch nicht schlecht. Und vor allem leicht zu handhaben!
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
KKO
 2004-12-31 13:32
#77654 #77654
User since
2003-11-05
124 Artikel
BenutzerIn

user image
man kann es beim filtern schon ziemlich gut checken:
Code: (dl )
1
2
3
4
5
$text='xxxxxx [EMAIL=1.birne@onlinehome.de]1.birne@onlinehome.de[/EMAIL] xxxxxx [EMAIL=2.apfel@gmx.de]2.apfel@gmx.de[/EMAIL] xxxxx [EMAIL=3_phirsich@aol.com]3_phirsich@aol.com[/EMAIL]
xxxxxxxxx 4_pflaume@web.info xx [EMAIL=5.kirsche@plus-minus.de]5.kirsche@plus-minus.de[/EMAIL] ';

$such='[a-zA-Z0-9\.\-\_]+'; #alles was erlaubt ist
(@emails) = $text =~ m/($such\@$such)/gi;
Gruß
KKO
havi
 2004-12-31 13:50
#77655 #77655
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Eine ziemlich einfach aber gute Loesung hat Relais vor einiger
Zeit mal gepostet.
Benutze doch einfach mal die Such-Option im (neuen) Forum.

Gruss
format_c
 2004-12-31 14:34
#77656 #77656
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[E|B
,30.12.2003, 23:44]Mail::Verify ist auch nicht schlecht. Und vor allem leicht zu handhaben!

Zumal es auch den passenden DNS-Entry des MX-Servers versucht zu finden.

Gruß Alex
havi
 2004-12-31 14:38
#77657 #77657
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Ich lese gerade das Buch Programmieren mit Perl-Modulen.
Werd bei Zeiten mal nachsehen ob ueber dieses Modul auch etwas zu finden ist.

... sehr, sehr gutes Buch von O'Reilly!

Gruss
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2004-12-30 22:23.