URL使得正则表达式测试冻结

时间:2013-07-07 09:02:33

标签: javascript jquery regex

我正在尝试使用标识URL的正则表达式。 我把它从: Check if a Javascript string is a url 它的代码是:

function ValidURL(str) {
  var pattern = new RegExp('^(https?:\/\/)?'+ // protocol
    '((([a-z\d]([a-z\d-]*[a-z\d])*)\.)+[a-z]{2,}|'+ // domain name
    '((\d{1,3}\.){3}\d{1,3}))'+ // OR ip (v4) address
    '(\:\d+)?(\/[-a-z\d%_.~+]*)*'+ // port and path
    '(\?[;&a-z\d%_.~+=-]*)?'+ // query string
    '(\#[-a-z\d_]*)?$','i'); // fragment locater
  if(!pattern.test(str)) {
    alert("Please enter a valid URL.");
    return false;
  } else {
    return true;
  }
}

每当我发送以下错误网址时: “http://www.pinevalleyscountrycreations.com/sitebuildercontent/sitebuilderpictures/ .gif”

要浏览此代码,我的浏览器会冻结几分钟,但在冻结后会返回一个真值。

关于正则表达式对这两个问题的辩护中缺少什么的任何想法?冻结和错误的返回值?

提前致谢!

1 个答案:

答案 0 :(得分:1)

[a-z\d]([a-z\d-]*[a-z\d])*更改为[a-z\d]([a-z\d-]*[a-z\d])?(注意最后一个字符),它将按预期运行。你还需要逃避所有的反斜杠;将\d更改为\\d,将\.更改为\\.,将\?更改为\\?。 <{1}}和:根本不需要转义。

问题在于/有几种方法可以匹配“pinevalleyscountrycreations”(2 26 = 67108864种方式)。在回溯时,它会在放弃之前尝试匹配字符串的每种可能的方式。该组和[a-z\d]([a-z\d-]*[a-z\d])*仍然是必需的,否则它将与单个字符不匹配。

?