#!/usr/bin/perl use strict; use warnings; use 5.024; use utf8; use HTML::Parser; use URI; my $current_uri = "https://example.org/tests/" ; # enthält aktuelle URL (notwendig für relative URLs) my $source = <<'HTML'; Test 1 ?>
 


HTML ### Hier kommt der Parser { # HTML-Parser erzeugen my $p = HTML::Parser->new(); $p->empty_element_tags( 1 ); # Handlerroutine für bestimmte Startelemente registrieren $p->handler( start => \&start, "tagname,attr,self" ); # Handlerroutine für normalen Textinhalt registrieren $p->handler( text => sub { print shift }, "dtext,self" ); # Kommentare $p->handler( comment => sub { print shift }, "text" ); # PHP oder anderes $p->handler( process => sub { print shift }, "text" ); # HTML scannen $p->parse( $source ); # Parsen beenden $p->eof; # Handler für HTML-Startelemente sub start { my ( $tag, $attr, $self ) = @_; # HTML-Element
        if ( lc $tag eq "pre" ) {
            $self->handler( start => sub { print shift }, 'text' );
            $self->handler( end   => \&end,               "tagname,self" );
        }

        # -Block
        if ( lc $tag eq "code" ) {
            $self->handler( start => sub { print shift }, 'text' );
            $self->handler( end   => \&end,               "tagname,self" );
        }

        #  HTML-Element a, ein Link
        if ( lc $tag eq "a" ) {
            $self->handler( end => \&end, "tagname,self" );

            # URLs in RFC-gültige URI umwandeln
            local $URI::ABS_REMOTE_LEADING_DOTS = 1;
            $attr->{ href } = URI->new( $attr->{ href } )->abs( $current_uri );
        }

        # andere HTML Elemente wieder ausgeben (samt Attributen!)
        print "<$tag";
        # zum HTML-Element Attribute und Werte ausgeben
        while ( my ( $att, $val ) = each %{ $attr } ) {
            print qq/ $att="$val"/;
        }
        print ">";
    } ## end sub start

    # Handler für HTML-Endelemente
    sub end {
        my ( $tag, $self ) = @_;

        # HTML-Endelement ausgeben
        print "";
    }

}