Javascript正则表达式空白是古怪的

时间:2012-07-06 19:08:47

标签: javascript regex

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

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

2 个答案:

答案 0 :(得分:2)

由于您使用的是JavaScript,为什么不能只使用getElementsByTagName('script')?这就是你应该怎么做的。

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

答案 1 :(得分: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\s*=\s*((["'])blahblah\2|\bblahblah\b)/.test(startTag)。哦,看起来 - 它又回到了可怕的地方 - 简化!

这次通过标准化: startTag = startTag.replace(/\s*=\s*/g, '=').replace(/=([^\s"'>]+)/g, '="$1"') - 现在你处于危险区域,如果=在引用的字符串中怎么办?你能看出它变得越来越复杂吗?

如果您对要使用它的HTML做出健全的假设(即使其成为常规),那么您只能使用正则表达式进行此工作。否则你的问题会成长,成长和成长!

  • 免责声明:我没有测试任何正则表达式,看看他们是否按照我说的做,他们只是示例尝试。