2012-06-23 3 views
6

Я использую функцию strip_tags(), но мне нужно, чтобы удалил некоторые теги (и все их содержимое).PHP: 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

Начать с [DOM] (http://php.net/dom) и [XPath] (http://uk.php.net/manual/en/class.domxpath.php) – DaveRandom

+1

Вопрос уже ответил здесь: http://stackoverflow.com/questions/9788621/is-there-an-alternative-to-phps-strip-tags – Jocelyn

+0

Я пробовал принятый ответ в этом посте, но не был удовлетворен результатами – Dylan

ответ

11

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

$tags = array('p', 'span'); 
$text = preg_replace('#<(' . implode('|', $tags) . ')>.*?<\/$1>#s', '', $text); 

demo показывает, что замена требуемых тегов ничего.

Обратите внимание, что вам может потребоваться изменить его, скажем, для компенсации пробелов в тегах или других неизвестных, которые ваш пример не демонстрирует.

Вот регулярное выражение, чтобы использовать для захвата тегов с или без атрибутов:

'#<(' . implode('|', $tags) . ')(?:[^>]+)?>.*?<\/$1>#s' 
+0

@Downvoter - Любые комментарии как почему мой функциональный ответ был понижен? – nickb

+2

Спасибо, это прекрасно для моей ситуации. Я очищаю HTML, используя простой синтаксический анализатор html dom и просто нуждаюсь в дополнительной защите. – Dylan

+0

UPDATE: это регулярное выражение разделяет только теги без атрибутов ... кажется, что работает следующее: $ text = preg_replace ('# <('. Implode ('|', $ tags). '). *>. *? #s ',' ', $ text); – Dylan

1

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

Смежные вопросы