0

在使用 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,但在以下亚马逊 url 上(具有讽刺意味的是)使用 jQuery Mobile书创建移动应用程序,它挂起。在 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 或电子邮件的东西都可能会很痛苦)。

4

2 回答 2

0

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

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

foo正则表达式在哪里。

于 2013-05-21T20:03:39.103 回答
0

正则表达式以及 Chrome 的解释方式似乎存在问题。在 Firefox 中它可以工作。

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

如果您不需要评估 url 中的端口,请使用以下内容:/^(https?://)?([\da-z.-]+).([az.]{2,6} )([/\w .-] ) /?$/

于 2013-05-22T22:34:53.560 回答