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