2015-08-17 14 views
5

Chciałbym usunąć wszystkie treści (pomiędzy znacznikami) z ciągu HTML. Czy istnieje elegancki sposób na to zrobić bez pisania złożonego regex?Usunąć zawartość między tagami HTML w PHP?

Jeśli chcesz, to faktycznie szukam naprzeciwko tego, co robi strip_tags().

Sugestie?

+1

Użyj parsera DOM. – David

+0

Lub spróbuj tego https://code.google.com/p/phpquery/ –

Odpowiedz

7

Ten roztwór używa wyrażenia regularnego. Pozwolę ci zdecydować, czy jest to skomplikowane, czy nie.

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

Złammy go:

  • (?<=^|>): A lookbehind. Nie pasuje, ale wciąż musi tam być. Pasuje zarówno początek sznurka (^) lub dosłownym >.
  • .*?: Zapałki nic (s modyfikatora umożliwia to przełamane). Znak zapytania sprawia, że ​​jest leniwy - pasuje do jak najmniej znaków.
  • (?=<|$): a uprzedzona. Mecze albo dosłowne < lub na końcu łańcucha ($).

ten został zastąpiony przez nic (""), tak, że wszystko między > i < zostanie usunięty. Robocze demo można zobaczyć here. Nie zachowuje białych znaków, więc kończy się jedną bardzo długą linią.

EDIT: Jeśli wiesz, że Twój wkład będzie zawsze owinięte w znacznikach HTML można zrobić to nawet prostsze dla siebie, ponieważ nie trzeba myśleć o początku i końcu ciąg bitów:

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

Ten wariant nie będzie działać dla danych wejściowych z tekstem na początku lub na końcu - na przykład stanie się Hello<b></b>!.

Powiązane problemy