2015-08-17 3 views
5

Я хотел бы удалить все содержимое (между тегами) из строки HTML. Есть ли элегантный способ сделать это без написания сложного регулярного выражения?Удалить содержимое между HTML-тегами в PHP?

Если вы хотите, я действительно ищу напротив того, что strip_tags() делает.

Предложения?

+1

Используйте парсер DOM. – David

+0

Или попробуйте https://code.google.com/p/phpquery/ –

ответ

7

Это решение использует регулярное выражение. Я позволю вам решить, сложна она или нет.

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

Давайте разбить его:

  • (?<=^|>): 'назад. Совсем не соответствует, но он все еще должен быть там. Соответствует началу строки (^) или литералу >.
  • .*?: Совпадает ни с чем (s модификатор делает включение новой строки). Вопросительный знак делает его ленивым - он соответствует как можно меньшему количеству символов.
  • (?=<|$): Взгляд. Соответствует буквам < или концу строки ($).

Это заменяется ничем (""), так что все между > и < удаляется. Рабочую демонстрацию можно увидеть here. Он не сохраняет пробелы, поэтому вы получаете одну супер длинную линию.

EDIT: Если вы знаете, что ваш вклад всегда будет обернут в HTML-тегов, которые вы можете сделать это еще проще для себя, так как вы не должны думать о начале и конце строки битов:

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

Этот вариант не будет работать для ввода с текстом в начале или в конце - например, станет Hello<b></b>!.