Я использую 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 я соскабливаю, и теги, которые нужно удалить, все время разные.
Я искал часы для функции, которая соответствует моим потребностям, но не могла найти ничего полезного.
Есть идеи?
Используйте регулярное выражение. Что-то вроде этого должно работать:
$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).
Простой подход HTML DOM более безопасен и более стабилен, чем регулярное выражение.