Sie sind in Kategorie Perl

Brotkrumennavigation


Samstag, 26. Januar 2008

HTML::TagFilter und XHTML

Schlagworte: , , ,
26.01.2008 · 15:03
Es ist möglich mit dem Modul HTML-TagFilter HTML zu filtern. Das ist ganz nützlich für Eingaben über Eingabefelder in Webanwendungen, bei denen nur bestimmte HTML-Elemente erlaubt sind. Nun hat aber HTML-TagFilter ein Problem mit HTML, wenn implizit geschlossene Elemente verwendet werden.

Ein implizit geschlossenes Element ist eines, das kein schließendes Element besitzt, sondern einen Schrägstrich vor der schließenden spitzen Klammer.

Also wie zum Beispiel <img src="test.jpg" />.

Problem

Die Problematik ist im CPAN-Bugtracker als #22135: self-closing tags are improperly rewritten beschrieben.

Das folgende Programm dient zum Testen und filtert nur die Bilder heraus. Dabei sind in Bildern alle Attribute erlaubt.

Programmcode

#!/usr/local/bin/perl

use strict;
use warnings;

use HTML::TagFilter;

my $p = HTML::TagFilter->new (
    # allow only img-Tags with all attributes
    allow=>{ img=> { any => [] } }	
);

$p->parse(<<'HTML');
	<body onload="aaa">
		<p onclick="a"><img onload="AAAA" src="a.jpg" alt="Bild 1" /></p>
		<p />
		<div>
			<br />
			<hr                    />
			<a href="a"/></div>
		<script/>
                           <img src="AAAA.gif" />
	</body>

</html>
HTML

print $p->output;

Ausgabe

Wird das Programm aufgerufen, so erzeugt es folgende Ausgabe:


		<img onload="AAAA" src="a.jpg" alt="Bild 1" /="/">



                           <img src="AAAA.gif" /="/">






Definitiv falsch, denn es wird ein nicht vorhandenes Attribut / mit dem Wert / erzeugt und das Schließen des Elements verschluckt.

Lösung

Im Grunde genommen einfach.
HTML-TagFilter ist ja ein Kind von HTML-Parser und erbt dessen Methoden.

Wenn HTML mit implizit geschlossenen Elementen gefiltert werden soll, muss der XML-Modus von HTML-Parser aktiviert werden.

Testcode

Das geschieht mit folgendem Zeile Perlcode:

$p->xml_mode(1);

Programmausgabe

Wird dann das Programm ausgerufen, wird auch ein schließendes Element erzeugt:


                   <img onclick="AAAA" src="a.jpg" alt="Bild 1"></img>



                           <img src="AAAA.gif"></img>






Was wiederum gültiges HTML ist.

Autor: GwenDragon · Kategorie Perl · Permalink · Kommentare (3) · Kommentar schreiben

Kommentare

Kommentare als Feed · Kommentar schreiben

#1 GwenDragon schrieb am 27.1.2008 14:50 folgendes:

Ich habe gestern das als Bugfixmöglichkeit an dem Maintainer gemeldet.

Ein neues HTML-TagFilter wird wohl demnächst kommen.

#2 GwenDragon schrieb am 3.5.2010 18:30 folgendes:

Ein Fix ist wohl doch nicht eingearbeitet worden.

#3 GwenDragon schrieb am 13.2.2011 15:19 folgendes:

Der Perl-Code

$p->empty_element_tags(1);

vor dem p->parse() erzeugt auch das gewünschte Ergebnis des korrekt geschlossen HTML-Elements.

↑Artikel


Kommentar für Blogeintrag

Vorschau des Kommentars

Kommentar

Mit * gekennzeichnete Felder müssen angegeben werden.



(Textformatierung in Markdown möglich)

Hinweis zum Datenschutz

Falls es Probleme mit Kommentaren/Trackbacks gibt, bitte ich um eine Beschreibung per E-Mail.

TrackBack-URL: http://gwendragon.de/blog/Computer/Programmieren/Perl/html-tagfilter-bei-xhtml.html/trackback

↑Artikel