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

GwenDragon
 2023-02-01 12:13
#194628 #194628
User since
2005-01-17
14761 Artikel
Admin1
[Homepage]
user image
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)

View full thread HTML::Parser - Attribute von HTML ändern, welche sich nicht(!) unterhalb <pre> oder <code> befinden