2015-08-17 23 views
5

Ich möchte den gesamten Inhalt (zwischen Tags) aus einer HTML-Zeichenfolge entfernen. Gibt es eine elegante Möglichkeit, dies zu tun, ohne komplexe Regex zu schreiben?Inhalt zwischen HTML-Tags in PHP entfernen?

Wenn Sie wollen, bin ich eigentlich auf der Suche nach der gegenüber von was strip_tags() tut.

Vorschläge?

+1

Verwenden Sie einen DOM-Parser. – David

+0

Oder probieren Sie diese https://code.google.com/p/phpquery/ –

Antwort

7

Diese Lösung verwendet Regex. Ich werde Sie entscheiden lassen, ob es komplex ist oder nicht.

$out = preg_replace("/(?<=^|>).*?(?=<|$)/s", "", $in); 

Lassen Sie uns es brechen:

  • (?<=^|>): Ein Lookbehind. Nicht wirklich abgestimmt, aber es muss immer noch da sein. Entspricht entweder dem Anfang der Zeichenfolge (^) oder dem Literal >.
  • .*?: Entspricht allem (s Modifikator macht es newline). Das Fragezeichen macht es faul - es passt so wenig Zeichen wie möglich.
  • (?=<|$): Ein Lookahead. Entspricht entweder dem Literal < oder dem Ende der Zeichenfolge ($).

Dies wird durch nichts ("") ersetzt, so dass alles, was zwischen > und < gelöscht. Eine funktionierende Demo kann gesehen werden here. Whitespace wird nicht beibehalten. Sie erhalten also eine super lange Zeile.

EDIT: Wenn Sie wissen, dass Ihre Eingabe wird immer in HTML-Tags eingewickelt werden, können Sie es für sich selbst machen noch einfacher, da man über den Anfang und das Ende der Zeichenfolge Bits müssen nicht denken:

$out = preg_replace("/>.*?</s", "><", $in); 

Diese Variante funktioniert nicht für die Eingabe mit Text am Anfang oder Ende - zum Beispiel wird Hello<b></b>!.