#!/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 "$tag>";
}
}