1

我正在尝试使用识别 URLS 的正则表达式。我取自: 检查 Javascript 字符串是否为 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;
  }
}

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

通过这段代码,我的浏览器冻结了几分钟,但在冻结之后它返回一个真值。

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

提前致谢!

4

1 回答 1

1

更改[a-z\d]([a-z\d-]*[a-z\d])*[a-z\d]([a-z\d-]*[a-z\d])?(注意最后一个字符),它将按预期运行。您还需要转义所有反斜杠;更改\d\\d、和。\._ _ 并且根本不需要逃脱。\\.\?\\?:/

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

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;
  }
}
于 2013-07-07T14:32:28.083 回答