Monica y Stefan
Leonardo, Daniela

HomeFotosLeonardoDanielaKalenderPerl

Verweise in HTML Dokumenten erkennen

Steht ein Verweis nur als einfacher Text in einem HTML Dokument so lässt er sich nicht anklciken und ist deshalb nahezu 'wertlos'. Verweise in einem Text zu erkennen und klickbar zu machen ist keine einfache Aufgabe. Dabei dürfen Verweise, die bereits mit einem <A> Tag umgeben sind, natürlich nicht mehr verändert werden.
Eine mit einem recht umfangreichen regulären Ausdruck ausgerüstete Subroutine nimmt sich dieser Herausforderung an. Es kann eine ganze Reihe von Verweistypen erkannt und umgewandelt weden:

  • http://www.domain.com
  • http://domain.com
  • www.domain.com
  • info@doamin.com
  • Bilder im jpg, gif oder png Format
  • diverse Verwistypen wie news, goopher, ftp etc.

Grundlage dieser Subroutine ist das Programm urlify (6.21) aus dem Perl Kochbuch.

Meldungen über Fehler und Erweiterungen sind natürlich willkommen: stefan@berger.net

$html = &url_link($html);

sub url_link
    {
    my $text = $_[0];
    my $urls = '(' . join('|', qw{ http ftp mailto https gopher news nntp telnet irc link }) . ')';
    my $ltrs = '\w';
    my $gunk = '/#~:.?$`{}+=&%@\'!\-';
    my $punc = '/.:!?\-';
    my $any = ${ltrs} . ${gunk} . ${punc};
    my $domain = '-A-Za-z\d\.';
    my $tld = '(' . join('|', qw{ ac ad ae af ag ai al am an ao aq ar as at au aw az ba bb bd be bf bg bh bi bj bm bn bo br bs bt bv bw by bz ca cc cd cf cg ch ci ck cl cm cn co cr cs cu cv cx cy cz de dj dk dm do dz ec ee eg eh er es et eu fi fj fk fm fo fr fx ga gb gd ge gf gg gh gi gl gm gn gov gp gq gr gs gt gu gw gy hk hm hn hr ht hu id ie il im in int io iq ir is it je jm jo jp ke kg kh ki km kn kp kr kw ky kz la lb lc li lk lr ls lt lu lv ly ma mc md mg mh mil mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nc ne nf ng ni nl no np nr nt nu nz om pa pe pf pg ph pk pl pm pn pr pro ps pt pw py qa re ro ru rw sa sb sc sd se sg sh si sj sk sl sm sn so sr st su sv sy sz tc td tf tg th tj tk tm tn to tp tr tt tv tw tz ua ug uk um us uy uz va vc ve vg vi vn vu wf ws ye yt yu za ze zm zr zw aero asia biz cat com coop edu gov info int jobs mobi museum name net org pro tel travel post }) . ')';
    my $email = '\w!#$%^&\-+=~`\'{}/?.';
    $text =~ s{\b((${urls}:[$any]+?)|(www\.[$domain]+\.${tld}(/[$any]+)*)|(ftp\.[$domain]+\.${tld}(/[$any]+)*)|([$email]+\@[$domain]+\.${tld}))(?=[$punc]*[^$any]|\>\;|\Z)\b(?!(</a>|"))}
        {
        my $temp = $1;
        if ($temp =~ m/\.jpe*g$/i || $temp =~ m/\.gif$/i || $temp =~ m/\.png$/i) { $temp = '<img src="' . $temp . '">'; }
        elsif ($temp =~ m/^www/i) { $temp = '<a href="http://' . $temp . '" target="_blank">' . $temp . '</a>'; }
        elsif ($temp =~ m/^ftp/i && $temp !~ m#^ftp://#i) { $temp = '<a href="ftp://' . $temp . '" target="_blank">' . $temp . '</a>'; }
        elsif ($temp =~ m/^link/i) { }
        elsif ($temp =~ m/^${urls}/i) { $temp = '<a href="' . $temp . '" target="_blank">' . $temp . '</a>'; }
        else { $temp = '<a href="mailto:' . $temp . '">' . $temp . '</a>'; }
        $temp;
        }goei;
    return $text;
    }

zum Inhalt