Удалить весь текст внутри определенных тегов

Мне интересно удалить весь текст в следующих тегах:

<p class="wp-caption-text">Remove this text</p>

Может ли кто-нибудь дать мне представление о том, как это можно сделать в php?

Большое Вам спасибо


person Levi    schedule 14.01.2011    source источник
comment
Вы хотите сохранить тег и удалить текст или удалить весь элемент?   -  person Matt Lowden    schedule 14.01.2011
comment
возможный дубликат Regex - захватить определенное слово в определенных тегах и еще как минимум несколько десятков. Используйте анализатор DOM, и решение будет одинаковым для любого текста Fetch. контент для <whatever>   -  person Gordon    schedule 14.01.2011
comment
Честно говоря, я не фанат ни одного из этих ответов. Хотя патчи хорошие, они ни в коем случае не являются решением. Единственное реальное решение — пройтись по коду и с самого начала удалить места, которые генерируют этот контент. В противном случае вы будете тратить время на создание контента и на удаление контента.   -  person Geoffrey Wagner    schedule 14.01.2011
comment
@Geoffrey, это правда, но мы не знаем, контролирует ли OP генерирующий код. Он/она может копаться в чьем-то блоге.   -  person Gordon    schedule 14.01.2011
comment
@Gordon И именно поэтому я ответил на вопрос ниже регулярным выражением, потому что оно отвечает на OP   -  person Geoffrey Wagner    schedule 14.01.2011
comment
@Geoffrey, что все еще не делает вопрос менее дублирующим. На самом деле, отвечать на дубликаты не рекомендуется. Это загромождает место.   -  person Gordon    schedule 14.01.2011
comment
@Gordon Гордон, то, что ты видишь как беспорядок, я вижу как подтверждение. Чем больше раз кто-то формулирует один и тот же вопрос по-разному, тем больше вероятность, что кто-то что-то найдет в Google и найдет совпадение. Особенно, если они задают очень простые вопросы о регулярных выражениях, что означает, что у них очень мало опыта программирования в области манипулирования строками.   -  person Geoffrey Wagner    schedule 14.01.2011
comment
@ Джеффри Нет. Это обсуждалось до тошноты. Общее мнение заключается в том, что некоторые дубликаты хороши для покрытия вариаций но охват всех возможных вариантов - нет. Ежедневно возникает как минимум один вопрос о том, как извлечь x из html. Это совершенно лишнее, потому что все эти вопросы в основном задают одно и то же. Не имеет значения, является ли элемент foo или bar, и не имеет значения, является ли класс wp_foo или xy_bar. Это совершенно не относящиеся к делу детали для решения.   -  person Gordon    schedule 14.01.2011
comment
@ Гордон, а решение какое? google. com?q=remove+thing+from+string+because+i+dont+know+how+t Кажется глупым обижать человека (именно так я сейчас воспринимаю вашу сторону аргумента здесь), потому что он не знаю термин. То, что что-то обсуждается очень долго, не означает, что это правильно. Я уверен, что большая группа людей с важными должностями обсуждала (ссылка на взрывоподобное устройство, упавшее над Японией, которое складывает фильтры переполнения из комментариев) также очень подробно.   -  person Geoffrey Wagner    schedule 14.01.2011
comment
@Geoffrey Вы предполагаете, что люди тупые, но они просто ленивы. ОП был достаточно умен, чтобы задать довольно общий вопрос об удалении всего текста в определенных тегах. Если вы введете это как вопрос, SO предложит возможные дубликаты уже в форме ввода. Если бы ОП потратил время на их просмотр (что поощряется принудительной страницей Ask Advice), он/она выучил бы правильные термины и справочную информацию и в конечном итоге смог бы решить этот вопрос из того, что уже есть.   -  person Gordon    schedule 14.01.2011
comment
@Geoffrey, кроме того, даже если миллионы дубликатов не помогли бы ОП, все же лучше закрыть голосование / не отвечать на этот вопрос и указать ОП на существующий соответствующий вопрос, который касается проблемы на более высоком уровне или достаточно похож решить проблему. Это по-прежнему оставляет вопрос доступным для поиска в Google, но ведет к более каноническому и, надеюсь, более полному решению. Вы только бросили ОП рыбу. Он/она скопирует это и ничего не узнает.   -  person Gordon    schedule 14.01.2011


Ответы (4)


Избавьтесь от тега и содержимого внутри него:

 $content = preg_replace('/<p\sclass=\"wp\-caption\-text\">[^<]+<\/p>/i', '', $content);

или если вы хотите сохранить теги:

 $content = preg_replace('/(<p\sclass=\"wp\-caption\-text\">)[^<]+(<\/p>)/i', '$1$2', $content);
person Geoffrey Wagner    schedule 14.01.2011
comment
Работал как шарм. Огромное спасибо - person Levi; 14.01.2011

Как более высокоуровневая альтернатива регулярным выражениям.

Вы можете обрабатывать с помощью DOM. Вы можете сопоставить все узлы, которые вы ищете, с помощью XPath //p[@class="wp-caption-text"].

Например:

$doc = new DOMDocument();
$doc->loadHTML($yourHTMLasString);
$xpath = new DOMXPath($doc);
$query = '//p[@class="wp-caption-text"]';
$entries = $xpath->query($query);
foreach ($entries as $entry) {
    $entry->textContent = '';
}
echo $doc->saveHTML();
person vartec    schedule 14.01.2011
comment
Мне тоже очень нравится это решение. Просто помните, что и это, и регулярное выражение имеют большие накладные расходы по мере увеличения размера документа. Я бы рекомендовал выполнять эти операции только один раз и сохранять вывод в кеш для резервирования без обработки. - person Geoffrey Wagner; 14.01.2011
comment
@Geoffrey: правда, для очень больших файлов я бы рекомендовал переписать приведенную выше логику в XSLT и запустить ее с процессором SAX XSLT. - person vartec; 14.01.2011

Попробуй это:

$string = '<p class="wp-caption-text">Remove this text</p>'; 
$pattern = '/(.*<p .*>).*(<\/p>.*)/'; 
$replacement = '$1$2'; 
echo preg_replace($pattern, $replacement, $string); 
person Chandu    schedule 14.01.2011
comment
Этот REGEXP не будет работать, если строка представляет собой целую веб-страницу. Ваш .* между вашими тегами p будет захватывать столько, сколько сможет для всей страницы, пока не найдет самый последний p на странице. - person Geoffrey Wagner; 14.01.2011

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

person cromestant    schedule 14.01.2011
comment
Не могли бы вы предоставить пример кода того, как я мог бы это сделать, так как я очень неопытен с php - person Levi; 14.01.2011