9

使用 Dom Crawler 仅获取文本(无标签)。

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

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

输出:获取描述凑凑

我想输出(仅):获取描述

更新:

我找到了一个解决方案:(但它真的很糟糕)

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

6 回答 6

4

遇到了同样的情况。我最终选择了:

$html = $crawler->filter('.coucu')->html();
$html = explode("<span", $html);
echo trim($html[0]);
于 2015-05-26T14:36:09.127 回答
3

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

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

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

text() 方法返回列表中第一项的值。

于 2015-05-18T01:29:34.623 回答
1
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();
}
于 2019-02-22T05:59:31.020 回答
0

这很好地工作,没有 hacky 解决方法:

$crawler->filter('.coucu')->children()->each(function (Crawler $crawler) {
    $crawler->getNode(0)->parentNode->removeChild($crawler->getNode(0));
});
$crawler->text(); // Get Description
于 2019-11-21T14:18:27.243 回答
0

HTML-removing 解决方案它基于正则表达式来去除 HTML(坏主意使用正则表达式解析 HTML:为什么不呢?),并且爆炸解决方案是有限的。

我想出了不同之处:获取所有文本,然后用 . 删除非自己的文本str_replace

于 2018-04-06T15:17:52.980 回答
0
$div = $crawler->filter('.coucu')->html();
$span = $crawler->filter('.coucu > span')->html();
$text = strip_tags(str_replace($span,'',$div));
于 2020-01-01T11:55:37.260 回答