use HTML::Parser; use URI; sub replace_with_absolute_uri { # Parameter: # $source: HTML als Zeichenkette # $current_uri: $current_uri: absoluter URI als Ziel # Returns # geändertes HTML als String my $source = shift; my $current_uri = shift; # Puffer für geänderte Elemente my @replaced_data = (); # Variablen für Handler der Start-/Endelemente des HTML my ( $mystart, $myend ); # Handler HTML-Startelemente $mystart = sub { my ( $tag, $attr, $self ) = @_; # HTML-Element
unverändert ausgeben
        if ( lc $tag eq "pre" ) {
            $self->handler(
                start => sub { my $s = shift; push @replaced_data, $s; },
                'text'
            );
            $self->handler( end => $myend, "tagname,self" );
        }

        # HTML-Element , Code-Blocks unverändert ausgeben
        if ( lc $tag eq "code" ) {
            $self->handler(
                start => sub { my $s = shift; push @replaced_data, $s; },
                'text'
            );
            $self->handler( end => $myend, "tagname,self" );
        }

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

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

        local $URI::ABS_REMOTE_LEADING_DOTS = 1;
        # auch Attribut src, falls esistent! bei anderen HTML-Elemente auf absolute URI ändern
        $attr->{ src } = URI->new( $attr->{ src } )->abs( $current_uri )
          if exists $attr->{ src };

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

    # Handler HTML-Endelemente
    $myend = sub {
        my ( $tag, $self ) = @_;

        # HTML-Endelement ausgeben
        push @replaced_data, "";
    };

    # HTML-Parser erzeugen
    my $p = HTML::Parser->new();
    $p->empty_element_tags( 1 );
    $p->xml_pic( 1 );    # damit auch z.B.  geparst wird

    # Handlerroutine für bestimmte Startelemente registrieren
    $p->handler( start => $mystart, "tagname,attr,self" );
    # Handlerroutine für bestimmte Endelemente registrieren
    $p->handler( end => $myend, "tagname,self" );
    # Handlerroutine für normalen Textinhalt registrieren
    $p->handler(
        text => sub { my $s = shift; push @replaced_data, $s; },
        "text"
    );
    # Handlerroutine für Kommentare        registrieren
    $p->handler(
        comment => sub { my $s = shift; push @replaced_data, $s; },
        "text"
    );
    # Handlerroutine für PHP und anderes mit 
    $p->handler(
        process => sub { my $s = shift; push @replaced_data, $s; },
        "text"
    );

    # HTML nun parsen und ändern
    $p->parse( $source );

    return join "", @replaced_data;
} ## end sub replace_with_absolute_uri