2009-07-01 23 views
8

Gibt es sowieso einfacher als HTML HTML aus einer Zeichenfolge mit Perl zu entfernen?Wie kann ich HTML in einer Zeichenfolge mit Perl entfernen?

$Error_Msg =~ s|<b>||ig; 
$Error_Msg =~ s|</b>||ig; 
$Error_Msg =~ s|<h1>||ig; 
$Error_Msg =~ s|</h1>||ig; 
$Error_Msg =~ s|<br>||ig; 

Ich würde sowohl einen abgespeckten regulären Ausdruck, z. so etwas wie dieses:

$Error_Msg =~ s|</?[b|h1|br]>||ig; 

Gibt es eine bestehende Perl-Funktion, die jede/alle HTML aus einem String-Streifen, auch wenn ich nur bolds, h1 Header und br gestrippt müssen?

Antwort

18

den Code Unter der Annahme gilt HTML (kein Streu < oder> Betreiber)

Wenn Sie nur bolds entfernen müssen, h1 ist und br des

$htmlCode =~ s#</?(?:b|h1|br)\b.*?>##g 

Und Sie könnten die in Erwägung ziehen, HTML::Strip Modul

+5

Ich würde nicht sagen, könnte, würde ich sagen sollte. Der Versuch, HTML mit Regexes zu bereinigen, ist in der heutigen Zeit absurd. Verwenden Sie eines der zahlreichen HTML-Desinfektionsmodule aus dem CPAN, vorzugsweise etwas, das XSS-Sicherheitslücken verhindern soll und nicht von Daniel Muey geschrieben wurde. –

+2

Vorsicht HTML :: Strip unterstützt UTF-8-codierte Strings nicht korrekt.Hier finden Sie einen Workaround https://gist.github.com/910818 – nick

14

Von perlfaq9: How do I remove HTML from a string?


Der korrekteste Weg (wenn auch nicht der schnellste) ist HTML :: Parser von CPAN zu verwenden. Ein anderer, meist korrekter Weg ist HTML :: FormatText, der nicht nur HTML entfernt, sondern auch versucht, den resultierenden Klartext etwas einfacher zu formatieren.

Viele Leute versuchen einen einfachen Ansatz für reguläre Ausdrücke, wie s/<. *?> // g, aber das scheitert in vielen Fällen, weil die Tags über Zeilenumbrüche fortgesetzt werden können, sie können zitierte spitze Klammern enthalten. oder HTML-Kommentar vorhanden sein. Außerdem vergessen Leute, Entitäten zu konvertieren - wie zum Beispiel <.

Hier ist ein „einfältig“ -Ansatz, die für die meisten Dateien funktionieren:

#!/usr/bin/perl -p0777 
s/<(?:[^>'"]*|(['"]).*?\1)*>//gs 

Wenn Sie eine vollständigere Lösung wollen, finden Sie in das 3-stufigen striphtml Programm in http://www.cpan.org/authors/id/T/TO/TOMC/scripts/striphtml.gz.

Hier sind einige schwierige Fälle, die Sie denken sollten, wenn eine Lösung Kommissionierung:

<IMG SRC = "foo.gif" ALT = "A > B"> 

<IMG SRC = "foo.gif" 
ALT = "A > B"> 

<!-- <A comment> --> 

<script>if (a<b && a>c)</script> 

<# Just data #> 

<![INCLUDE CDATA [ >>>>>>>>>>>> ]]> 

Wenn HTML-Kommentare andere Tags enthalten, würden diese Lösungen auf Text wie dieser Bruch auch:

<!-- This section commented out. 
    <B>You can't see me!</B> 
--> 
+0

Zu Ihrem Skriptvorschlag - http://www.cpan.org/authors/id/T/TO/TOMC/scripts/striphtml.gz - Das löscht alles. Wie kann ich diesen Code ändern, um nur bestimmte HTML-Tags zu lassen? Ansonsten funktioniert es gut. – PKHunter

14

Sie sollten sich unbedingt die HTML::Restrict ansehen, mit der Sie die erlaubten HTML-Tags entfernen oder einschränken können. Ein minimales Beispiel, dass alle HTML-Tags abstreift:

use HTML::Restrict; 

my $hr = HTML::Restrict->new(); 
my $processed = $hr->process('<b>i am bold</b>'); # returns 'i am bold' 

würde ich empfehlen, von HTML :: Streifen zu bleiben weg, weil it breaks utf8 encoding.

+0

Ich wünschte, ich hätte diese Antwort vor ein paar Wochen gelesen. – Steven

+0

Es funktioniert nicht mit Perl 5.8.x. Es ist ein super Programm, aber es wäre schön zu wissen, wie seine Support-Struktur ist. – PKHunter

+0

Ich bin mir auch nicht sicher, ob es eine Möglichkeit gibt, die Tags zu verlassen (erlaubte Tags), die keine offenen und geschlossenen Tags haben. Beispiel '
' ist schwer zu identifizieren. – PKHunter

Verwandte Themen