从html源代码中删除评论

时间:2011-06-10 11:23:09

标签: php curl

我知道如何通过cUrl获取html源代码,但我想删除html文档上的注释(我的意思是<!-- .. -->之间的内容)。另外,如果我只能获取html文档的BODY。谢谢。

5 个答案:

答案 0 :(得分:26)

尝试PHP DOM*

$html = '<html><body><!--a comment--><div>some content</div></body></html>'; // put your cURL result here

$dom = new DOMDocument;
$dom->loadHtml($html);

$xpath = new DOMXPath($dom);
foreach ($xpath->query('//comment()') as $comment) {
    $comment->parentNode->removeChild($comment);
}

$body = $xpath->query('//body')->item(0);
$newHtml = $body instanceof DOMNode ? $dom->saveXml($body) : 'something failed';

var_dump($newHtml);

<强>输出

string(36) "<body><div>some content</div></body>"

答案 1 :(得分:1)

如果在cUrl中没有这个选项(我怀疑没有,但我以前错了)那么你至少可以用PHP解析生成的HTML到你内心的内容DOM parser

从可配置性和支持性的角度来看,这可能是您最好的选择。

答案 2 :(得分:0)

我会将它用于sed以获取正则表达式,例如

curl http://yoururl.com/test.html | sed -i "s/<!\-\-\s?\w+\s?\-\->//g" | sed "s/.?(<body>.?</body>).?/\1/"

正则表达式可能不准确,但你明白了......

答案 3 :(得分:0)

正则表达式为我解决了以下问题:

@InboudChannelAdapter

答案 4 :(得分:0)

我遇到了在foreach循环中修改DOMNodeList的问题,但我iterated backwards through the list消失了。因此,我不会建议像接受的答案中那样foreach循环。而是像这样使用for循环:

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
for ($els = $xpath->query('//comment()'), $i = $els->length - 1; $i >= 0; $i--) {
    $els->item($i)->parentNode->removeChild($els->item($i));
}