簡體   English   中英

DOMDocument從HTML源中刪除腳本標記

[英]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對象(及其所有后代- DOMElementDOMNodeList !和其他一些),當它的父元素的變化,最明顯的是當其子女人數變化自動更新。 這是在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.

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