好的,要扩展 Kolink 的答案,您不需要 iframe 或事件处理程序:
var temp = document.createElement('div');
temp.innerHTML = otherHtml;
var scripts = temp.getElementsByTagName('script');
...现在脚本是脚本元素的 DOM 集合 - 并且脚本不会被执行...
为什么正则表达式对此不是一个好主意:
由于一个<script>
元素可能在任何地方都不包含字符串</script>
,因此编写一个正则表达式来匹配它们并不难:/<script[.\n]+?<\/script>/gi
看起来您只想匹配具有特定类型属性的脚本。您也可以尝试将其包含在您的模式中:/<script[^>]+type\s*=\s*(["']?)blahblah\1[.\n]*?<\/script>/gi
-但这太可怕了。(这就是在不规则字符串上使用正则表达式时会发生的情况,您需要简化)
因此,您可以遍历所有基本匹配的脚本,提取起始标签:result.match(/<script[^>]*>/i)[0]
然后在其中搜索您的 type 属性/type\s*=\s*((["'])blahblah\2|\bblahblah\b)/.test(startTag)
。哦,看 - 又变回可怕了 - 简化!
这次通过规范化:
startTag = startTag.replace(/\s*=\s*/g, '=').replace(/=([^\s"'>]+)/g, '="$1"')
- 现在您处于危险境地,如果=
在带引号的字符串中怎么办?你能看到它是如何变得越来越复杂的吗?
如果您对将使用它的 HTML 做出可靠的假设(即使其成为常规),您只能使用正则表达式来完成这项工作。否则你的问题会越来越大,越来越大!
- 免责声明:我没有测试任何用于查看它们是否按照我所说的那样做的正则表达式,它们只是示例尝试。