Thread HTML::Parser und substr() (46 answers)
Opened by GwenDragon at 2023-05-09 13:09

GwenDragon
 2023-05-09 13:09
#194829 #194829
User since
2005-01-17
14608 Artikel
Admin1
[Homepage]
user image
Ich nutze auf einem Linux-Server HTML::Parser, um mit dtest nur den Textinhalt zu bekommen.

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
use strict; use warnings; use 5.020;
use utf8;

my $maxlen = 300;

# $data wird aus einer Datei gefüllt, ich habe den Code entfernt

# kürzen
$data = shorten($data);

sub shorten {
    my $source = shift;

    # Puffer für geänderte Elemente
    my @replaced_data = ();

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

    # Handlerroutine für bestimmte Startelemente registrieren
    $p->handler( start => sub { return "" } );

    # Handlerroutine für bestimmte Endelemente registrieren
    $p->handler( end => sub { return "" } );

    # Handlerroutine für Textinhalt + Deskodierung registrieren
    $p->handler(
        text => sub { my $s = shift; push @replaced_data, $s; }, 
                "dtext"
    );
    # Handlerroutine für Kommentare    registrieren
    $p->handler(
        comment => sub { return "" },
        "text"
    );
    # Handlerroutine für PHP und anderes mit <? ?>
    $p->handler(
        process => sub { return "" },
        "text"
    );

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

    # stop parsing
    $p->eof();

    my $data = join "", @replaced_data;
    return substr( $data, 0, $maxlen ) . '…';
} ## end sub shorten

print "Content-Type: text/html; charset: utf-8\n\n";
print "<!DOCTYPE HTML>
<html>
<body>
<p>$data</p>
</body>
</html>
";

Soweit ist das ok, wenn ich substr() nicht nutze und dann den kompletten Text ausgebe.

Nun will ich aber den String mit substr() kürzen.
Gehe ich aber dann gekürzte Teilkette aus, ist es an manchen Stellen (z.B. bei Umlauten) innerhalb des Unicodezeichens gekürzt, also wird aus 0xC30xA4 dann 0xC3, was eher invalides HTML5 ergibt.

verstehe ich die Doku zu substr() falsch? Die schreiben doch character.

Was ist mein Denkfehler?
Last edited: 2023-05-09 13:27:32 +0200 (CEST)

View full thread HTML::Parser und substr()