2016-08-24 2 views
-2

Как удалить все из страницы, кроме текста внутри <p> tag?Удалить все, кроме внутреннего тега

Страница:

This is text. 
 
    <div class="text">This is text in 'div' tag</div> 
 
    <p>This is text in 'p' tag</p>

Ожидаемый результат:

Это текст в 'р' тег

приветствий.

+2

Можете ли вы дать больше информации о том, что вы хотите сделать? – Blobonat

ответ

0

В принципе, вам придется разбирать разметку. PHP поставляется с хорошим анализатором в виде the DOMDocument class, так что это на самом деле очень просто:

$dom = new DOMDocument; 
$dom->loadHTML($htmlString); 

Далее, получить все p теги:

$paragraphs = $dom->getElementsByTagName('p'); 

Этот метод возвращает DOMNodeList объект, который реализует Traversable интерфейс, так что вы можете использовать его как массив DOMNode экземпляров (DOMElement в данном случае):

$first = $paragraphs->item(0);//or $paragraphs[0] even 
foreach ($paragraphs as $p) { 
    echo $p->textContent;//echo the inner text 
} 

Если вы хотите только элементы абзаца, не содержит дочерние элементы, то вы можете легко проверить, что:

foreach ($paragraphs as $p) { 
    if (!$p->hasChildNodes()) { 
     echo $p->textContent; // or $p->nodeValue 
    } 
} 

близкородственного ответ еще с некоторыми ссылками/информация: How to split an HTML string into chunks in PHP?

0

Вы можете легко сделать это с помощью родной PHP strip_tags функции следующим образом:

strip_tags("<p>This is text in 'p' tag</p>"); 

Которая вернется так, как вы ожидали, «Это текст в теге« p ». Примечание: это только полезно, когда у вас есть внешний контейнер DIV, и вы используете немного грязного RegExp для того, чтобы отогнать не только P, но все теги ожидаемого пользователя (экс . тег div). Эта функция имеет один аргумент и второй необязательный аргумент. Первый - это строка, из которой вы снимаете теги, а вторая указывает допустимые теги, которые не будут разделены как строка. Эти теги не будут удалены в процессе. Для получения дополнительной информации о функции strip_tags нажмите here.

Надеюсь, у вас есть идея :)

+0

Вы не обращаетесь к первой части вопроса: как извлечь теги 'p' из строки. Например, в примере кода OP есть тег div. Как бы вы их обработали? –

+0

Нравится: strip_tags ("

This is text in 'div' tag
") -> replace ('class = "text"', ""); –

+0

Моя точка зрения стоит: как вы извлекаете строку 'div' из исходной строки?Вы просто не можете этого сделать без разбора DOM. Разметку нужно разобрать, чтобы вы могли определить, где сидят теги 'p', есть или нет теги _inside_ этот тег абзаца и обрабатывать их правильно. Ваш ответ предполагает, что более или менее входная строка всегда будет в формате: « текстовое содержимое» _, что, очевидно, не так. BTW: 'strip_tags ($ string) -> replace (" attribute = 'value' ", '');' недопустимый синтаксис, а бессмысленные теги полосы также очищают атрибуты –