2011-01-09 2 views
2

I mit Ausnahme eines div class alle HTML-Inhalten aus einem String entfernen möchten: <div class="toto">blablabla</div>Entfernen Sie alle HTML-Tags und Inhalte mit Ausnahme eines div class

Sollte ich einen Regex oder DOM Parser verwenden?

zu beantworten drachenstern:

Es ist ein Kommentar Inhalt mit bbcode. Und die HTML in diesem div wird mit Geshi (Code Highlighter) generiert, so dass ich dies nicht löschen möchte.

Zum Beispiel kann ein Besucher <script></script> in einem [code][/code] BBCode-Tag eingeben. Alle HTML außerhalb der [code][/code] BBCode-Tag muss löschen Nein?

Antwort

1

Es ist almost impossible to use a Regex to successfully extract data from a webpage so würde ich stattdessen vorschlagen, eine dedicated HTML parser verwenden. Einige Probleme sind einfach zu groß für Sie, um sie jedes Mal anzugehen, daher wird es als gut und akzeptabel für use an external library angesehen.

Wenn Sie nur das eine Div benötigen, würde ich gerne wissen, was Sie mit dem bestimmten div zu tun versuchen. Kann es clientseitig funktionieren oder muss es serverseitig passieren? Versuchen Sie einen Kratzer zu schreiben?

+0

Es ist ein Kommentar Inhalt mit bbcode. Und das HTML in diesem div wird mit Geshi (Code Highlighter) erzeugt, also möchte ich das nicht löschen. Ein Besucher kann z. B. in einem [code] [/ code] BBCode-Tag eingeben, aber nicht außerhalb. Sorry für mein schlechtes Englisch:/ – CrazyMax

+0

Ihr Englisch ist nicht schlecht, und ich bin mir immer noch nicht ganz sicher, was das Problem ist. Filtern Sie Eingaben in einem Formular und versuchen, XSS zu verhindern, bevor Sie Elemente auf die Seite zurückgeben? – jcolebrand

+0

Ja, ich habe PHP IDS verwendet, um die Injektion und Akismet für Spam zu verhindern. – CrazyMax

0

Ich glaube, Sie wissen schon die Antwort :-)

Aber im Ernst ... in diesem Fall ist es von der Komplexität der umgebenden Saite hängt ... Wenn es eine große Varianz oder das Snippet haben Sie wollen keep ist tief verschachtelt, dann macht ein dom-parser sonse .. wenn der umgebende Inhalt ziemlich vorhersehbar ist, dann kann eine Regex das tun. Ich würde wahrscheinlich das DOM verwenden, weil es einfacher wird, mit dem DOM zu arbeiten und am ausfallsichersten zu sein.

0

Sofern Sie nicht garantieren können, dass dieser Abschnitt der Zeichenfolge GENAU des Formulars <div class="toto".....</div> ist, kann Regex es nicht tun. Mit genau meine ich hauptsächlich keine anderen Attribute vor class und keinem anderen div Element in diesem. Groß-/Kleinschreibung, Leerraum und einfache/doppelte Anführungszeichen sollten von Regex verarbeitet werden können.

Da Sie wahrscheinlich nicht, diese Garantien machen (es wäre ein Ausnahmefall sein, wenn Sie könnten), können Sie einen DOM-Parser

brauchen Auch wenn Sie regex Arbeit für diesen sehr speziellen Fall machen tun, wenn Sie Um mögliche Änderungen zu haben oder ähnliche Aufgaben an anderer Stelle auszuführen, wird sich der DOM-Parser schnell lohnen.

EDIT - hatte versehentlich Whitespace kategorisiert, behoben.

0

Wordpress und andere noch Kses verwenden und es scheint ein ziemlich flexibel Filter zu sein - haben einen Blick auf sie hier: http://sourceforge.net/projects/kses/

Beispiel:

$string = kses($string, array('div' => array('valueless' => 'n', value => 'toto'))); 
+0

Ok danke roman :) – CrazyMax

+0

Ich versuchte kses aber ist nur 'strip_tags' und nicht den Inhalt zu entfernen :( – CrazyMax

+0

sollte nur passieren, wenn Sie nicht $ allowed_html übergeben (das zweite Argument) - ich habe ein Beispiel zu diesem Beitrag hinzugefügt ... – roman

0

(Ich bin von der PHP-Tag unter der Annahme, dass das folgende wäre nützlich ...)

strip_tags() macht genau dies.Der Beispielcode

<?php 
$text = '<p>Test paragraph.</p> <div class="blah">Other text</div>'; 

echo strip_tags($text, '<div>'); 
echo "\n"; 
?> 

erzeugt die Ausgabe

Test paragraph. <div class="blah">Other text</div> 
+0

Ich will nicht den Inhalt, ich möchte die gesamten HTML-Tags außerhalb [Code] löschen [/ code] – CrazyMax

+0

Fair genug - ich habe die Frage falsch verstanden. – metadaddy

+0

Ok kein Problem;) – CrazyMax

Verwandte Themen