Symfony 2 Dom Crawler:如何在Element中只获取text()

时间:2015-05-08 05:34:40

标签: symfony domcrawler

使用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');

6 个答案:

答案 0 :(得分:5)

陷入同样的​​境地。我最终选择了:

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

答案 1 :(得分:2)

根据您问题中的标准,我认为最好将CSS Selector修改为:$crawler = $crawler->filter('div.coucu > span')

从那里你可以去$span_text = $crawler->text();

或简化事情:$text = $crawler->filter('div.coucu > span')->text();

text() method返回列表中第一个项目的值。

答案 2 :(得分:0)

HTML删除解决方案基于正则表达式去除HTML(糟糕的主意Using regular expressions to parse HTML: why not?),并且爆炸解决方案是有限的。

我差点儿来:得到所有文字,然后用str_replace删除非自己的文字。

答案 3 :(得分:0)

function extractCurrentText(Crawler $crawler)
{
  $clone = new Crawler();
  $clone->addHTMLContent("<body><div>" . $crawler->html() . "</div></body>", "UTF-8");
  $clone->filter("div")->children()->each(function(Crawler $child) {
    $node = $child->getNode(0);
    $node->parentNode->removeChild($node);
  });
  return $clone->text();
}

答案 4 :(得分:0)

这很好用,没有hacky解决方法:

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

答案 5 :(得分:0)

$div = $crawler->filter('.coucu')->html();
$span = $crawler->filter('.coucu > span')->html();
$text = strip_tags(str_replace($span,'',$div));