簡體   English   中英

從 html 源代碼中刪除注釋

[英]remove comments from html source code

我知道如何通過 cUrl 獲取 html 源代碼,但我想刪除 html 文檔上的注釋(我的意思是<.--.. -->之間的內容)。 另外,如果我可以只取 html 文件的BODY 謝謝你。

嘗試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);

Output

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

如果在 cUrl 中沒有此選項(我懷疑沒有,但我之前錯了),那么您至少可以使用Z2FEC392304A5C23AC138DA2解析生成的HTML到您心中的內容

從長遠來看,這可能是您在可配置性和支持方面的最佳選擇。

正則表達式為我解決了這個問題,如下所示:

function remove_html_comments($html = '') {
    return preg_replace('/<!--(.|\s)*?-->/', '', $html);
}

我遇到了在 foreach 循環中修改 DOMNodeList 的問題,該循環消失了,我向后迭代了 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));
}

我會 pipe 它到 sed 的正則表達式,類似

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

正則表達式可能不准確,但你明白了......

在我的情況下這項工作:

preg_replace('/<!--[\s\S]*?-->/', '', $html);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM