9

尝试在 Chrome 的 JS 控制台中输入此内容。这是我发现的一个正则表达式,用于检查某些东西是否是有效的 URL:

"http://www.kvraudio.com/".match(/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/);

应该返回匹配项。现在试试这个:

"tp:/www.kvraudio.com/forum/viewtopic.php".match(/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/);

返回 Null,因为它不匹配。现在.....试试这个:

"http://www.kvraudio.com/forum/viewtopic.php?p=5238905".match(/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/);

没有什么!JS 似乎以某种方式死了或陷入了循环。如果我在实际网页中使用上述内容,它会停止响应。甚至不会滚动!那么有人对此有任何解释吗?我做错了什么?!

4

1 回答 1

17

因为你有灾难性的回溯

([\/\w \.-]*)*

应修改此表达式以删除其中一颗星 ( *):

([\/\w \.-]*)

请注意,灾难性回溯通常仅在无法进行匹配时才抬起丑陋的头。这就是您给出的第一个示例执行没有任何问题的原因。

您的第二个示例在到达 之前退出([...]*)*,因此回溯没有机会生效。

有关灾难性回溯的更彻底解释,请参阅我对这个问题的回答:
如何识别邪恶的正则表达式?

于 2013-06-14T20:24:54.020 回答