0

我正在尝试编写一个正则表达式来搜索页面以查找任何脚本标签并提取脚本内容,并且为了适应任何 HTML 编写风格,我希望我的正则表达式包含带有任意数量空白字符的脚本标签(例如<script type = blahblah>并且<script type=blahblah>应该都可以找到)。我的第一次尝试得到了奇怪的结果,所以我将问题分解为更简单的问题,并决定只测试和使用像 /\s*h\s*/g 这样的正则表达式。

当在字符串上测试它时,由于某种原因,'h' 周围的完全任意数量的空格将是匹配的,而其他任意数量的空格则不会匹配,例如“h”会匹配但“h”不会匹配。有谁知道为什么会发生这种情况或我正在犯的错误?

4

2 回答 2

2

既然您使用的是 JavaScript,为什么不能只使用getElementsByTagName('script')? 这就是你应该这样做的方式。

如果您有一个 HTML 字符串,请创建一个 iframe 并将 HTML 转储到其中,然后getElementsByTagName('script')在其上运行。

于 2012-07-06T19:12:11.910 回答
0

好的,要扩展 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 做出可靠的假设(即使其成为常规),您只能使用正则表达式来完成这项工作。否则你的问题会越来越大,越来越大!

  • 免责声明:我没有测试任何用于查看它们是否按照我所说的那样做的正则表达式,它们只是示例尝试。
于 2012-07-06T19:53:41.547 回答