[英]Remove <html> and <head> tags at DOMDocument::saveXML
[英]DOMDocument remove script tags from HTML source
我在這里使用@Alex的方法使用內置的DOMDocument從HTML文檔中刪除腳本標記。 問題是,如果我有一個帶有Javascript內容的腳本標記,然后是另一個鏈接到外部Javascript源文件的腳本標記,則不會從HTML中刪除所有腳本標記。
$result = '
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>
hey
</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
alert("hello");
</script>
</head>
<body>hey</body>
</html>
';
$dom = new DOMDocument();
if($dom->loadHTML($result))
{
$script_tags = $dom->getElementsByTagName('script');
$length = $script_tags->length;
for ($i = 0; $i < $length; $i++) {
if(is_object($script_tags->item($i)->parentNode)) {
$script_tags->item($i)->parentNode->removeChild($script_tags->item($i));
}
}
echo $dom->saveHTML();
}
以上代碼輸出:
<html>
<head>
<meta charset="utf-8">
<title>hey</title>
<script>
alert("hello");
</script>
</head>
<body>
hey
</body>
</html>
從輸出中可以看出,只刪除了外部腳本標記。 有什么辦法可以確保刪除所有腳本標記嗎?
你的錯誤實際上是微不足道的。 一個DOMNode
對象(及其所有后代- DOMElement
, DOMNodeList
!和其他一些),當它的父元素的變化,最明顯的是當其子女人數變化自動更新。 這是在PHP文檔的幾行中寫的,但大多數都是在地毯下。
如果你使用($k instanceof DOMNode)->length
循環,然后從節點中刪除元素,你會發現length
屬性實際上發生了變化! 我不得不寫自己的庫來抵消這個和其他一些怪癖。
解決方案:
if($dom->loadHTML($result))
{
while (($r = $dom->getElementsByTagName("script")) && $r->length) {
$r->item(0)->parentNode->removeChild($r->item(0));
}
echo $dom->saveHTML();
我實際上並沒有循環 - 只需一次彈出第一個元素。 結果: http : //sebrenauld.co.uk/domremovescript.php
為了避免您獲得實時節點列表的驚喜 - 隨着刪除節點而縮短 - 您可以使用iterator_to_array
將副本復制到數組中:
foreach(iterator_to_array($dom->getElementsByTagName($tag)) as $node) {
$node->parentNode->removeChild($node);
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.