Arhn - архитектура программирования

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

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

Любые идеи?


  • Начните с DOM и XPath 23.06.2012
  • Здесь уже дан ответ на вопрос: stackoverflow.com/questions/9788621/ 23.06.2012
  • Я попробовал принятый ответ в этом посте, но не был удовлетворен результатами. 23.06.2012

Ответы:


1

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

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

демонстрация показывает, что нужные теги заменяются ничем.

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

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

'#<(' . implode( '|', $tags) . ')(?:[^>]+)?>.*?<\/$1>#s'
23.06.2012
  • @Downvoter - Любой комментарий относительно того, почему мой функциональный ответ был отклонен? 23.06.2012
  • Спасибо, это идеально подходит для моей ситуации. Я соскребаю HTML с помощью простого синтаксического анализатора html dom, и мне просто нужна дополнительная зачистка. 23.06.2012
  • ОБНОВЛЕНИЕ: это регулярное выражение удаляет только одиночные теги без атрибутов... похоже, работает следующее: \1›#s', '', $текст); 26.06.2012
  • @Dylan - ваши примеры не включают атрибуты - если вы хотите сопоставить их, вы должны использовать: '#<(' . implode( '|', $tags) . ')[^>]+>.*?</\1>#s'. 26.06.2012
  • @Dylan - Отказ от принятия этого ответа на том основании, что он не соответствует требованию, которое вы никогда не упоминали, смехотворно. Он прекрасно отвечает на заданный вами вопрос, что подтверждается связанной демонстрацией. 26.06.2012
  • Я согласен, я просто не хотел закрывать этот вопрос, надеясь получить еще несколько ответов. Ваше регулярное выражение теперь включает теги с атрибутами, но больше не работает для тегов без атрибутов. Моих знаний о регулярных выражениях, к сожалению, недостаточно, чтобы это исправить. 27.06.2012
  • обновление: с '#‹(' . implode( '|', $tags) . ')[^›]*?›.*?‹/\1›#s', кажется, работает для тегов с атрибутами и без атрибутов 27.06.2012
  • @Dylan - я обновил свой ответ с помощью регулярного выражения, которое будет захватывать теги с атрибутами или без них. 27.06.2012

  • 2

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

    27.06.2012
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..