Entfernen Sie alles innerhalb von Script- und Style-Tags

8

Ich habe eine Variable namens $articleText und sie enthält HTML-Code. Es gibt script und style Codes in <script> und <style> html Elementen. Ich möchte die $articleText scannen und diese Codeabschnitte entfernen. Wenn ich auch die tatsächlichen HTML-Elemente <script> , </script> , <style> und </style> entfernen könnte, würde ich das auch tun.

Ich stelle mir vor, dass ich Regex benutzen muss, aber ich bin nicht darin erfahren.

Kann jemand helfen?

Ich wünschte, ich könnte etwas Code zur Verfügung stellen, aber wie ich sagte, ich bin nicht in Regex geschult, so dass ich nichts zu zeigen habe.

Ich kann DOM nicht verwenden. Ich brauche speziell Regex gegen diese spezifischen Tags

    
jkushner 19.11.2013, 21:30
quelle

6 Antworten

20

Verwenden Sie RegEx nicht für HTML. PHP stellt ein Werkzeug zum Parsen von DOM-Strukturen bereit, das entsprechend DomDocument genannt wird.

%Vor%

Sie können es hier versuchen: Ссылка

Dokumentation

Chris Baker 19.11.2013, 21:59
quelle
17

Auch Regex ist kein gutes Werkzeug für diese Art von Aufgabe, für kleine, einfache Aufgaben kann es funktionieren.

Wenn Sie nur den inneren Text von Tags entfernen möchten, verwenden Sie:

%Vor%

Sehen Sie sich die Demo hier an.

Wenn Sie auch Tags entfernen möchten, wäre die Ersatzzeichenfolge im obigen Code leer, also nur "" .

    
Ωmega 19.11.2013 21:53
quelle
2

Ich denke, das sollte tun, was Sie brauchen (vorausgesetzt, es gibt keine geschachtelten Skript- und Style-Tags):

%Vor%     
Pappa 19.11.2013 21:43
quelle
2

Hier sind Beispieldaten:

%Vor%

Und jetzt die buchstabierte Version:

%Vor%

Und eine Alternative (macht dasselbe, nur keine Funktionsdeklarationen):

%Vor%

Der Trick besteht darin, iterieren rückwärts beim Löschen von Knoten . Und getElementsByTagName wird das gesamte DOM für Sie durchqueren, also müssen Sie das nicht (nichts davon hat hasChildNodes, nextSibling, nextChild Zeug).

Vielleicht liegt die beste Lösung irgendwo zwischen diesen beiden extremen Beispielen.

Ich konnte mir nicht helfen, das ist wahrscheinlich die beste Version meiner Vorschläge. Es enthält keinen Incrementor ( $i ), um Dinge aufzumischen und entfernt von unten nach oben:

%Vor%

Wenn Sie Knoten entfernen, werden sie in der Child-Liste des Elternteils nach oben verschoben, sodass 1 zu 0 und 2 zu 1 usw. wird. Machen Sie dies solange ( while ) bis es nicht mehr existiert ( ->item gibt null zurück ). Auch dies ist in einer wiederverwendbaren Funktion verpackt.

    
zamnuts 19.11.2013 21:38
quelle
0

Eine Regex, um dies zu tun, wäre unglaublich stumpf, wegen der Möglichkeit von Tags innerhalb von Tags und solchen verwirrenden Konstrukten wie Tag-Attributen.

Ich würde vorschlagen, dies in einem DOM (entweder in PHP oder JavaScript) zu tun, das die unerwünschten Tags durch tatsächliches Parsing identifizieren und entfernen kann.

    
Curt 19.11.2013 21:35
quelle
0

Wenn wir davon ausgehen, dass es nicht nur darum geht, dass Ihr Design nicht von zufälligen Stilen durcheinander gebracht wird, sondern Ihre Site auch vor dem Benutzer-Scripting schützt, ist das Entfernen dieser Tags nicht allein für Sie sicher.

Betrachten Sie den Fall von Ereignisattributen (Beispiel: onmouseover, onclick):

%Vor%

oder noch schlimmer

%Vor%

Damit ist es ziemlich trivial, alle möglichen Dinge in das Dokument einzufügen.

Letztes Beispiel für Stylesheet-Mods aus David Walsh - Ссылка

Die einzige Lösung

... ist eine bewährte Drittanbieter-Bibliothek, die sich darauf spezialisiert hat. Ich empfehle HTML Purifier . Es wird Ihre Benutzereingabe von Stilen, Skripten und lästigen Ereignisattributen befreien.

    
Web and Flow 25.09.2016 22:06
quelle

Tags und Links