Thread HTML::Parser und substr()
(46 answers)
Opened by GwenDragon at 2023-05-09 13:09
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) |