2011-11-13 82 views
10

或任何其他標記:)從HTML字符串中提取腳本標記

例如,

<head> 
    <title>page...</title> 
    <script> var a = 'abc'; </script> 
    <script src="foo.js" type="text/javascript"></script> 
    </head> 
    <body> 
    ... 
    <script src="foo2.js"></script> 
    </body> 

(這個字符串是從Ajax調用的響應)

我想獲得一個陣列3個字符串:

  1. <script> var a = 'abc'; </script>
  2. <script src="foo.js" type="text/javascript"></script>
  3. <script src="foo2.js"></script>

我該怎麼做?

回答

6

定義:outerHTML功能(從here拍攝)

jQuery.fn.outerHTML = function(s) { 
return (s) ? this.before(s).remove() : jQuery("&lt;p&gt;").append(this.eq(0).clone()).html(); 
} 

然後假設您的響應存儲在data你可以這樣做:

$(data).filter("script").each(function(e) { 
    // do something with $(e).outerHTML() 
}); 
+2

像一個OPs響應是扁平的字符串,'.find()'不會匹配任何東西。改用'.filter()'。 – jAndy

+0

@jAndy你是對的。已更新回答 – Strelok

+0

謝謝你結束我的1小時搜索 –

2

使用帶有模式<script[^<]*</script>的正則表達式。

+1

匹配HTML標籤的正則表達式比這更加複雜。我不認爲這是一個很好的答案。爲什麼當瀏覽器已經完成了所有的工作時,麻煩你了。 – Strelok

+1

'

'不能保存,這太遲了...... – jAndy

+0

@Strelok好的,但是要解析的字符串是「來自ajax調用的響應」。 Alex沒有說這個HTML代碼會被插入到頁面中。如果它不會比你不能使用DOM樹,並基於它的技術,如jQuery ... – kol

1

你可以嘗試這樣的:

function getScriptsAsText() { 
    var div = document.createElement('div'); 
    var scripts = []; 
    var scriptNodes = document.getElementsByTagName('script'); 

    for (var i=0, iLen=scriptNodes.length; i<iLen; i++) { 
    div.appendChild(scriptNodes[i].cloneNode(true)); 
    scripts.push(div.innerHTML); 
    div.removeChild(div.firstChild); 
    } 
    return scripts; 
} 

它以文本形式返回當前腳本元素的數組,包括他們的開始和結束標籤。

您也可以嘗試使用outerHTML,但它並沒有被廣泛支持。

+0

爲此,您需要將html字符串解析爲文檔。 https://developer.mozilla.org/en-US/docs/Code_snippets/HTML_to_DOM?redirectlocale = EN-US&redirectslug = Code_snippets%3AHTML_to_DOM –