1

我有一个正则表达式验证 url

/(^$|^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$)/

虽然我知道这在某种意义上是不正确的,例如它不允许使用井号,而不是抛出验证错误,它只是让应用程序崩溃。它似乎也使一个独立的正则表达式测试器崩溃。

用于测试的 URL 是http://www.wmagazine.com/celebrities/2012/10/jennifer-lawrence-actress-katniss-everdeen-hunger-games-cover-story-ss#slide=1

谁能解释为什么?

代码上下文是在模型中使用的,用于验证用户输入的要呈现到页面上的 URL

validates :source_link, :format => { :with => /(^$|^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$)/,
                                   :message => 'Only valid urls allowed' }, :if => :apply_validations?
4

2 回答 2

8

使事情崩溃的问题在这里:

/(^$|^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$)/
                                                 ^^^^^^^^^^^^^^

您正在嵌套量词,并且正则表达式在这里有太多可能找到有效匹配。这称为灾难性回溯

这匹配完全相同的字符串:

/(^$|^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)\/?$)/

当它不匹配时,它会更快地失败。

于 2013-05-23T21:31:16.060 回答
0

这应该做的工作:

^(?:https?:\/\/)?(?:[\da-z\.-]+)\.(?:[a-z\.]{2,6})(?:[\/\w \.#=-]*)\/?$

尽管我非常怀疑这是否适合匹配 URL,但我建议您查看其他答案。

在线演示1演示2

于 2013-05-23T21:31:33.280 回答