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 я соскабливаю, и теги, которые нужно удалить, все время разные.

Я искал часы для функции, которая соответствует моим потребностям, но не могла найти ничего полезного.

Есть идеи?

Используйте регулярное выражение. Что-то вроде этого должно работать:

 $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 более безопасен и более стабилен, чем регулярное выражение.