Javascript正则表达式文件类型崩溃铬

时间:2012-07-24 13:13:17

标签: javascript regex

我在尝试匹配包含图像文件扩展名的网址时遇到了一个奇怪的问题。正则表达式使用非常简单(没有url验证,但现在第一次迭代会做。)

我已经设置了一个小提琴,应该用语言来解释它。请看这里的小提琴:

http://jsfiddle.net/Vwat2/1/

注意:

  1. 确保您的测试使用chrome
  2. 确保您已为chrome打开任务管理器(设置图标>工具>任务管理器)
  3. 运行jsfiddle,在没有文件扩展名匹配的正则表达式将在你将url复制到textarea后3秒后激活并且可以正常运行,3秒后,文件扩展名匹配的那个将触发,如果它会影响你,文本不会改变为被解雇,你会看到jsfiddle在任务管理器中占用CPU
  4. 希望有人可以解释这里发生了什么,我在PHP和expresso中运行正则表达式并且它没有任何问题所以我不认为它卡在某种正则表达式内部循环或任何东西。

    感谢您的帮助

    编辑:这是一个精简的版本,更类似于我在我的应用程序中使用它(我已经从第一个小提琴中删除了计时器和其他助手)。

    http://jsfiddle.net/A96Mw/1/

2 个答案:

答案 0 :(得分:3)

两个字:Catastrophic backtracking

(?:[^ ]+)+\.

是一个无用的构造 - [^ ]+\.完全相同,不容易回溯。

通过嵌套两个量词,您将在一段时间内不会结束的字符串上获得指数级的运行时增长。有些浏览器可能会选择在几百万次循环后中止正则表达式匹配,其他浏览器(如Chrome似乎)会继续尝试。

答案 1 :(得分:2)

因为这个表达式(?:[^ ]+)+,似乎是Catastrophic Backtracking的情况。不知道为什么第一个有效,而第二个没有。

你想要的正则表达是

url = new RegExp("https?://(?:[^ ]+)\\.", "i")
// or
url = /https?:\/\/(?:[^ ]+)+\./i

imgurl = new RegExp("https?://(?:[^ ]+)\\.(?:jpe?g|gif|png)", "i")
// or
imgurl = /https?:\/\/(?:[^ ]+)+\.(?:jpe?g|gif|png)/i