2011-01-14 4 views
0

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

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

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

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

+1

Вы хотите сохранить метку и удалить текст или удалить весь элемент? –

+2

Возможный дубликат [Regex - Захват определенного слова в пределах определенных тегов] (http://stackoverflow.com/questions/3332619/regex-grab-a-specific-word-within-specific-tags) и, по крайней мере, несколько еще дюжина. Используйте [парсер DOM] (http://stackoverflow.com/questions/3577641/best-methods-to-parse-html/3577662#3577662), и решение будет одинаковым для любого «Fetch text content для' '" – Gordon

+2

Я на самом деле не поклонник любого из этих ответов, чтобы быть полностью честным. Хотя хорошие патчи они не являются решениями. Единственное реальное решение проходит через код и удаляет места, которые генерируют этот контент для начала. В противном случае у вас есть одно время для создания процесса, создающего контент, и один тратить время на удаление контента. –

ответ

3

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

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

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

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

Работал как шарм. Спасибо, куча – Levi

+0

@levi Не проблема! –

0

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

+0

Можете ли вы привести пример кода, как я мог это сделать, поскольку я очень неопытен с php – Levi

1

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

$string = '<p class="wp-caption-text">Remove this text</p>'; 
$pattern = '/(.*<p .*>).*(<\/p>.*)/'; 
$replacement = '$1$2'; 
echo preg_replace($pattern, $replacement, $string); 
+0

Этот REGEXP не будет работать, если строка представляет собой целую веб-страницу. Ваш. * Между вашими тэгами будет хватать как можно больше для всей страницы, пока не найдет самую последнюю страницу на странице. –

2

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

Вы можете обрабатывать 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(); 
+0

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

+0

@Geofferey: true, для очень больших файлов я бы рекомендовал переписать выше логику на XSLT и запустить ее с помощью процессора SAX XSLT. – vartec

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