Thread Email::Find und E-Mails in Links? (14 answers)
Opened by bianca at 2010-06-01 16:22

bianca
 2010-06-01 19:04
#137861 #137861
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
Danke topeg und pq. Ich habe parallel auch mal gebastelt und auch topeg's Vorschlag mal als Vergleich herangezogen:

Code (perl): (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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/perl -W
use strict;
use warnings;
use diagnostics;
use Data::Dumper;

my $testtext = <<TEXTPLAIN;
Dies ist ein kleiner
Test zur Erkennung von Hyperlinks test.de oder www.test.de oder http://www.test.de
oder https://www.testhttps.de
test Platzhalter ||2||||||||||||
oder (http://test.de/slash/pfad)
oder info\@test.example
Und hier ein Gemeinschaftstest: http://www.test.de/login_index.php?email=info\@test.example
mal schauen...
TEXTPLAIN

identifylinks (\$testtext,'<a href="%s" target="_blank">%s</a>','<a href="mailto:%s">%s</a>');
print "<pre>$testtext</pre>";
identifylinks_topeg (\$testtext,'<a href="%s" target="_blank">%s</a>','<a href="mailto:%s">%s</a>');
print "<pre>$testtext</pre>";

#--------#
sub identifylinks {
        #
        # Erkennt und markiert Hyperlinks in einem Text
        #
        # Aufruf:
        # =======
        # my $testtext = 'test: http://www.test.de';
        # identifylinks (\$testtext,'<a href="%s" target="_blank">%s</a>','<a href="mailto:%s">%s</a>');
        # print $testtext;
        #
        my $text = $_[0];
        my $link = $_[1];
        my $email_link = (defined $_[2] ? $_[2] : '');
        my $modul = 1;
        eval "use URI::Find; 1;" or $modul = 0;
        my (%uris,%zuordnung);
        my $erkennung = 1;
        while ($$text =~ m/\|{$erkennung,$erkennung}/) {                                                                                                                        # eindeutigen temporären Ersetzungsstring finden
                $erkennung ++;
        }
        if ($modul) {
                my $lfd_uri = 0;
                my $finder = URI::Find -> new (
                        sub {                                                                                                                                                                                           # URI und geschriebenen Link speichern
                                $lfd_uri ++;
                                $uris{$lfd_uri} = $_[0];
                                $lfd_uri ++;
                                $uris{$lfd_uri} = $_[1];
                                return sprintf ($link,@_);
                        }
                );
                $finder -> find ($text);
        }

        my $ersatz = 0;
        if (keys %uris) {                                                                                                                                                                                       # alle URI's verbergen vor E-Mail Erkennung
                $ersatz = 1;
                foreach my $lfd_uri (keys %uris) {
                        my $ersatz = '|' x $erkennung . $lfd_uri . '|' x $erkennung;
                        $$text =~ s/\Q$uris{$lfd_uri}/$ersatz/g;
                }
        }

        if ($email_link ne '') {                                                                                                                                                                        # E-Mail auch erwünscht?
                eval "use Email::Find; 1;" or $modul = 0;
                if ($modul) {
                        my $finder = Email::Find -> new (
                                sub { return sprintf ($email_link,$_[0] -> format,$_[1]); }
                        );
                        $finder -> find ($text);
                }
        }
        if ($ersatz) {                                                                                                                                                                                          # alle verborgenen URI's wieder hervorholen
                foreach my $lfd_uri (keys %uris) {
                        my $ersatz = '|' x $erkennung . $lfd_uri . '|' x $erkennung;
                        $$text =~ s/\Q$ersatz/$uris{$lfd_uri}/g;
                }
        }
}
#--------#
sub identifylinks_topeg {
  #
  # Erkennt und markiert Hyperlinks in einem Text
  #
  # Aufruf:
  # =======
  # my $testtext = 'test: http://www.test.de';
  # identifylinks (\$testtext,'<a href="%s" target="_blank">%s</a>','<a href="mailto:%s">%s</a>');
  # print $testtext;
  #
  my $text = $_[0];
  my $link = $_[1];
  my $email_link = (defined $_[2] ? $_[2] : '');

  if(eval "use URI::Find; 1;")
  {
    my $finder = URI::Find -> new (
      sub { return sprintf ($link,@_); }
    );

    my $call=sub{ return $_[0]; };
    if($email_link ne '' && eval "use Email::Find; 1;" ) # E-Mail auch erwünscht?
    {
      my $finder = Email::Find -> new (
        sub { return sprintf ($email_link,$_[0]->format,$_[1]); }
      );
      $call=sub
        {
          my $text=shift;
          $finder -> find (\$text);
          return $text;
        };
    }

    $finder -> find ($text, $call);
  }

}
#--------#


Ausgabe:
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
<pre>Dies ist ein kleiner
Test zur Erkennung von Hyperlinks test.de oder www.test.de oder <a href="http://www.test.de/" target="_blank">http://www.tes
t.de</a>
oder <a href="https://www.testhttps.de/" target="_blank">https://www.testhttps.de</a>
test Platzhalter ||2||||||||||||
oder (<a href="http://test.de/slash/pfad" target="_blank">http://test.de/slash/pfad</a>)
oder <a href="mailto:info@test.example">info@test.example</a>
Und hier ein Gemeinschaftstest: <a href="http://www.test.de/login_index.php?email=info@test.example" target="_blank">http://
www.test.de/login_index.php?email=info@test.example</a>
mal schauen...
</pre><pre>Dies ist ein kleiner
Test zur Erkennung von Hyperlinks test.de oder www.test.de oder <a href="<a href="http://www.test.de/" target="_blank">http:
//www.test.de/</a>" target="_blank"><a href="http://www.test.de/" target="_blank">http://www.test.de</a></a>
oder <a href="<a href="https://www.testhttps.de/" target="_blank">https://www.testhttps.de/</a>" target="_blank"><a href="ht
tps://www.testhttps.de/" target="_blank">https://www.testhttps.de</a></a>
test Platzhalter ||2||||||||||||
oder (<a href="<a href="http://test.de/slash/pfad" target="_blank">http://test.de/slash/pfad</a>" target="_blank"><a href="h
ttp://test.de/slash/pfad" target="_blank">http://test.de/slash/pfad</a></a>)
oder <a href="<a href="mailto:info@test.example" target="_blank">mailto:info@test.example</a>"><a href="mailto:info@test.exa
mple">info@test.example</a></a>
Und hier ein Gemeinschaftstest: <a href="<a href="http://www.test.de/login_index.php?email=info@test.example" target="_blank
">http://www.test.de/login_index.php?email=info@test.example</a>" target="_blank"><a href="http://www.test.de/login_index.ph
p?email=info@test.example" target="_blank">http://www.test.de/login_index.php?email=info@test.example</a></a>
mal schauen...
</pre>

Nach meiner bescheidenen Meinung verhindert topeg's Vorschlag nicht die "Übersetzung" von E-Mail innerhalb von Links oder ich hab es falsch implementiert.

Ergänzung (durch Edit): meine Herangehensweise besteht halt darin, die bereits durch URI::Find identifizierten Links dem Modul Email::Find erst garnicht mehr anzubieten, indem ich sie vorher temporär ersetze.
Last edited: 2010-06-01 19:06:15 +0200 (CEST)
10 print "Hallo"
20 goto 10

View full thread Email::Find und E-Mails in Links?