2011-11-13 85 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 –