我正在尝试使用标识URLS的正则表达式。
我取自:
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”

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

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

提前致谢!

最佳答案

[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”的方式(226 = 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;
  }
}

关于javascript - URL多数民众赞成在正则表达式测试卡住,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17510672/

10-16 15:30