PHP: strip_tags - удалить только определенные теги (и их содержимое)?
Я использую strip_tags()
функция, но мне нужно удалить некоторые теги (и все их содержимое).
например:
<div>
<p class="test">
Test A
</p>
<span>
Test B
</span>
<div>
Test C
</div>
</div>
Допустим, мне нужно избавиться от тегов P и SPAN и оставить только:
<div>
<div>
Test C
</div>
</div>
strip_tags
ожидает в качестве второго параметра теги, которые вы хотите сохранить.
В этом конкретном примере я мог бы использовать striptags($html, "<div>");
но HTML-код, который я очищаю, и теги, которые нужно удалить, все время разные.
Я часами искал функцию, которая бы соответствовала моим потребностям, но не смог найти ничего полезного.
Есть идеи?
2 ответа
Используйте регулярное выражение. Примерно так должно работать:
$tags = array( 'p', 'span');
$text = preg_replace( '#<(' . implode( '|', $tags) . ')>.*?<\/$1>#s', '', $text);
Демонстрация показывает, что нужные теги заменяются ничем.
Обратите внимание, что вам может понадобиться настроить его больше, скажем, чтобы компенсировать пробелы в тегах или другие неизвестные, которые ваш пример не демонстрирует.
Вот регулярное выражение, используемое для захвата тегов с атрибутами или без них:
'#<(' . implode( '|', $tags) . ')(?:[^>]+)?>.*?<\/$1>#s'
Вы говорите, что используете Simple HTML DOM (Хорошо! Это правильный способ разбора HTML). Когда мне нужно удалить тег и его содержимое, я делаю:
$rows = $html->find("span");
foreach ($rows as $row)
{
$row->outertext = "";
}
$html->load($html->save());
Последняя строка обязательна, потому что DOM запутывается после внесения изменений, поэтому весь DOM необходимо свернуть, а затем снова проанализировать, чтобы изменения стали постоянными (IMO, ошибка в Simple HTML DOM).
Подход Simple HTML DOM безопаснее и стабильнее, чем регулярное выражение.