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

Другие вопросы по тегам