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

topeg
 2010-06-01 20:20
#137878 #137878
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
2010-06-01T17:04:17 bianca
Ich habe parallel auch mal gebastelt

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
#--------#
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;
                }
        }
}
#--------#


Nun ein wenig kompliziert heschrieben. Macht das selbe ist aber etwas einfacher:

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
#--------#
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 %uris;

  # eindeutigen temporären Ersetzungsstring finden
  my $kennung = 'X';
  $kennung+=chr(int(65+rand(25))) while (index($kennung,$$text)>-1);

  my $uri_mod=eval "use URI::Find; 1;" || 0;
  my $mail_mod=0;
  $mail_mod=1 if($email_link ne '' && eval "use Email::Find; 1;");

  if ($uri_mod)
  {
    my $lfd_uri = 0;
    my $finder = URI::Find -> new (
      sub {
        # URI und geschriebenen Link speichern
        if($mail_mod)
        {
          my $origin=shift;
          my $text=shift;
          my $symbol_o=sprintf('%s%u',$kennung,++$lfd_uri);
          my $symbol_t=sprintf('%s%u',$kennung,++$lfd_uri);
          $uris{$symbol_o}=$origin;
          $uris{$symbol_t}=$text;
          return sprintf ($link,$symbol_o,$symbol_t);
        }
        else
        { return sprintf ($link,@_); }
      }
    );
    $finder -> find ($text);
  }


  # E-Mail auch erwünscht?
  if ($mail_mod)
  {
    my $finder = Email::Find -> new (
        sub { return sprintf ($email_link,$_[0] -> format,$_[1]); }
    );
    $finder -> find ($text);

    $$text=~s/$_/$uris{$_}/g for(keys(%uris));
  }
}
#--------#

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