Javascript正则表达式空格很古怪

Javascript regex whitespace is being wacky

本文关键字:空格 正则表达式 Javascript      更新时间:2023-09-26

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

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

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

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

好的,要扩展 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's*='s*((["'])blahblah'2|'bblahblah'b)/.test(startTag) 。 哦,看 - 它又回到了可怕的 - 简化!

这次通过规范化: startTag = startTag.replace(/'s*='s*/g, '=').replace(/=([^'s"'>]+)/g, '="$1"') - 现在您处于危险区域,如果=在带引号的字符串内怎么办? 你能看到它是如何变得越来越复杂的吗?

只有当你对你将使用它的 HTML 做出稳健的假设(即使其常规)时,你才能使用正则表达式来完成这项工作。 否则你的问题会越来越大,越来越大!

  • 免责声明:我没有测试任何用于查看它们是否按照我所说的方式执行的正则表达式,它们只是示例尝试。