假设我有以下字符串:
var myString = "<p>hello</p><script>console.log('hello')</script><h1>Test</h1><script>console.log('world')</script>"
我想使用split来获取包含脚本标记内容的数组。例如我希望我的输出是:
["console.log('hello')", "console.log('world')"]
我尝试过myString.split(/[<script></script>]/)
但是没有得到预期的输出。
感谢任何帮助。
答案 0 :(得分:7)
You can't parse (X)HTML with regex
相反,您可以使用innerHTML
解析它。
var element = document.createElement('div');
element.innerHTML = myString; // Parse HTML properly (but unsafely)
但是,这不安全。即使innerHTML
没有在script
元素内部运行JS,恶意字符串仍然可以运行任意JS,例如与<img src="//" onerror="alert()">
。
要避免此问题,您可以使用DOMImplementation.createHTMLDocument
创建一个新文档,该文档可用作沙盒。
var doc = document.implementation.createHTMLDocument(); // Sandbox
doc.body.innerHTML = myString; // Parse HTML properly
或者,新浏览器支持DOMParser
:
var doc = new DOMParser().parseFromString(myString, 'text/html');
将HTML字符串解析为DOM后,您可以使用getElementsByTagName
或querySelectorAll
等DOM方法获取所有script
元素。
var scriptElements = doc.getElementsByTagName('script');
最后,[].map
可用于获取每个script
元素textContent
的数组。
var arrayScriptContents = [].map.call(scriptElements, function(el) {
return el.textContent;
});
完整的代码将是
var doc = document.implementation.createHTMLDocument(); // Sandbox
doc.body.innerHTML = myString; // Parse HTML properly
[].map.call(doc.getElementsByTagName('script'), function(el) {
return el.textContent;
});
答案 1 :(得分:2)
Javascript代码:
function myFunction() {
var str = "<p>hello</p><script>console.log('hello')</script><h1>Test</h1><script>console.log('world')</script>";
console.log(str.match(/<script\b[^>]*>(.*?)<\/script>/gm));
}
答案 2 :(得分:1)
你必须像这样逃避正斜杠:/。
myString.split(/(<script>|<\/script>)/)