调试一个Javascript RegExp正则表达式:验证挂在Amazon URL上

Debugging a Javascript RegExp Regular Expression: Validation Hangs on Amazon URL

本文关键字:验证 Amazon URL 正则表达式 RegExp Javascript 一个 调试      更新时间:2023-09-26

在使用Javascript验证URL时,我使用了以下来自SO答案的代码:

function validateURL(textval) {
          var urlregex = new RegExp(
                "^(http|https|ftp)'://([a-zA-Z0-9'.'-]+(':[a-zA-Z0-9'.&%'$'-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])'.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)'.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)'.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9'-]+'.)*[a-zA-Z0-9'-]+'.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(':[0-9]+)*(/($|[a-zA-Z0-9'.','?'''''+&%'$#'=~_'-]+))*$");
          return urlregex.test(textval);
        }

这个函数对我尝试过的大多数url都很好,但是在下面的Amazon url上(具有讽刺意味的是)一个使用jQuery创建移动应用程序的移动书籍,它挂起了。在Chrome开发工具中,我什么也没看到,但在标签页内点击任何地方都不会做任何事情。

http://www.amazon.com/gp/product/178216006X/ref=s9_simh_gw_p351_d3_i4?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=0SDC8SED1N96XPK44VD2&pf_rd_t=101&pf_rd_p=1389517282&pf_rd_i=507846

URL很长,但我看不出有什么特别的。事实上,它通过了下面Scott's Playground页面上的Javascript验证。

我的问题不是如何在Javascript中做URL验证。我的问题如下:如果我使用Javascript正则表达式并且它挂在一段文本上,是什么使正则表达式像这样冻结浏览器?我怎样才能抓住这样的案例呢?

这是否只发生在这个答案中提到的new RegExp(...) vs /regex/ ?

在实际验证方面,我切换到一个不同的/regex/,但我仍然想张贴这个问题,因为它导致了一个相当痛苦的调试过程。(不过,任何试图用正则表达式验证url或电子邮件的方法都可能会很痛苦)。

对于这个正则表达式,这似乎是new RegExp(...)而不是/regex/发生的事情。对于URL验证和其他类型的正则表达式匹配,使用:

function validFoo(value) {
    return /foo/i.test(value);
}

其中foo为正则表达式

看起来正则表达式有问题,Chrome如何解释它。

问题在于url中的第二个请求参数(&)以及Chrome javascript引擎如何陷入循环。

如果你不需要计算url中的端口,可以这样做:/^ (https ?://) ? ([' da-z. -] +)。([a - z] {2,6}) ((/' w。)) /?美元/