Symfony 2 Dom Crawler: как получить только text() в Element

Использование Dom Crawler для получения только текста (без тега).

$html = EOT<<<
  <div class="coucu">
    Get Description <span>Coucu</span>
  </div>
EOT;

$crawler = new Crawler($html);
$crawler = $crawler->filter('.coucu')->first()->text();

выходные данные: получить описание Coucu

Я хочу вывести (только): Получить описание

ОБНОВЛЕНИЕ:

Я нашел решение для этого: (но это действительно плохое решение)

...
$html = $crawler->filter('.coucu')->html();
// use strip_tags_content in https://php.net/strip_tags
$html = strip_tags_content($html,'span');

person VoTue    schedule 08.05.2015    source источник
comment
Нет, я не использую jQuery   -  person VoTue    schedule 08.05.2015
comment
Я не думаю, что для этого есть метод, но вы можете попробовать $text = $crawler-›filter('.coucu')-›first()-›extract(array('_text')); я считаю, что он вернет тот же результат, но все же стоит попробовать   -  person Nawfal Serrar    schedule 08.05.2015
comment
Я использовал функцию извлечения(). Но это не работа.   -  person VoTue    schedule 08.05.2015
comment
Я предполагаю, что strip_tags_content взят из gist.github.com/marcanuy/7651298. Лично мне не нравятся регулярные выражения для HTML, они приводят к плохим вещам (заголовок stackoverflow.com/questions/590747/).   -  person reallynice    schedule 06.04.2018


Ответы (4)


Столкнулся с такой же ситуацией. В итоге я пошел с:

$html = $crawler->filter('.coucu')->html();
$html = explode("<span", $html);
echo trim($html[0]);
person wkm    schedule 26.05.2015

Основываясь на критериях вашего вопроса, я думаю, вам лучше всего изменить свой селектор CSS на: $crawler = $crawler->filter('div.coucu > span')

Оттуда вы можете перейти $span_text = $crawler->text();

или для упрощения: $text = $crawler->filter('div.coucu > span')->text();

Метод text() возвращает значение первого элемент в списке.

person Shaun Bramley    schedule 18.05.2015
comment
Я хочу получить Get Description Coucu. - person VoTue; 25.05.2015

Решение для удаления HTML основано на регулярных выражениях для удаления HTML (плохая идея Использование регулярных выражений для синтаксического анализа HTML: почему бы и нет?), и решение для взрыва ограничено.

Я пришел к разнице: получить весь текст, затем удалить чужой текст с помощью str_replace.

person reallynice    schedule 06.04.2018

Это прекрасно работает без хакерских обходных путей:

$crawler->filter('.coucu')->children()->each(function (Crawler $crawler) {
    $crawler->getNode(0)->parentNode->removeChild($crawler->getNode(0));
});
$crawler->text(); // Get Description
person Abdessamad    schedule 21.11.2019