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

Javascript regex filetype crashes chrome

本文关键字:崩溃 chrome 类型 文件 正则表达式 Javascript      更新时间:2024-01-19

我在尝试匹配末尾包含图像文件扩展名的url时遇到了一个奇怪的问题。regex-im-using非常简单(没有url验证,但第一次迭代就可以了)。

我已经架起了一把小提琴,它应该比我用语言解释得更好。在这里看小提琴:

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

注:

  1. 确保在铬中进行测试
  2. 确保已为chrome打开任务管理器(设置图标>工具>任务管理器)
  3. 运行jsfiddle,在您将url复制到文本区域后3秒,末尾没有文件扩展名匹配的regex将启动,并且会正常),3秒后,具有文件扩展名的regex会启动,如果它影响到您,则文本不会更改为已启动,您将看到jsfiddl占用任务管理器中的CPU

希望有人能解释一下这里发生了什么,我已经在PHP和expresso中运行了regex,它没有任何问题,所以我不认为它卡在某种regex内部循环或任何东西中。

感谢的帮助

编辑:这是一个精简版,更像我在应用程序中使用它(我从第一把小提琴上去掉了计时器和其他助手)。

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

两个词:灾难性回溯:

(?:[^ ]+)+'.

是一个无用的构造——[^ ]+'.完全匹配,不容易回溯。

通过嵌套这两个量词,您将在运行时得到不以句点结束的字符串的指数增长。一些浏览器可能会选择在数百万次循环后中止正则表达式匹配,而其他浏览器(如Chrome)则会继续尝试。

由于以下表达式,似乎是灾难性回溯的情况:(?:[^ ]+)+。不知道为什么第一个有效,而第二个无效。

您想要的正则表达式是

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