Thread HTML::Parser - Attribute von HTML ändern, welche sich nicht(!) unterhalb <pre> oder <code> befinden
(21 answers)
Opened by GwenDragon at 2023-01-30 18:12
ich wollte das noch teilen, für die es interessiert und die Helfenden (Danke!).
. Meine Lösung, um in einer Zeichenkette beim HTML mit den Attributen src und href die URLs zu absoluten URIs zu machen. 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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 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 <PRE>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>, 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 <A>, 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, "</$tag>"; }; # HTML-Parser erzeugen my $p = HTML::Parser->new(); $p->empty_element_tags( 1 ); $p->xml_pic( 1 ); # damit auch z.B. <?php .... ?> 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 Last edited: 2023-02-01 16:58:29 +0100 (CET) |