在使用 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 或电子邮件的东西都可能会很痛苦)。