Javascript 使正则表达式测试冻结的URL

Javascript 使正则表达式测试冻结的URL,javascript,jquery,regex,Javascript,Jquery,Regex,我试图使用一个正则表达式来标识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 '(\:\

我试图使用一个正则表达式来标识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时: “.gif”

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

关于regex对这两个问题的辩护缺失了什么,你有什么想法吗?冻结和错误的返回值

提前谢谢

[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])*
有几种方法可以匹配“PinevalleyScontryCreations”(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;
  }
}
[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])*
有几种方法可以匹配“PinevalleyScontryCreations”(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;
  }
}

似乎该正则表达式的问题在于,您需要双重转义,因为您正在将正则表达式构建为字符串。这不应该使任何内容暂停,它应该抛出一个错误。组有问题,当然传递到
新RegExp
的字符串中的
\d
不是数字的正则字符类(它只是字母
d
)。正如elclanrs指出的,如果字符串中有它,那么它必须是
\\d
。mmm我应该在哪里将\d改为\\d?在港口排队?它会将此字符串标识为无效URL吗?请参阅您发布的问题中的10票答案,它具有正确的正则表达式,并带有正确的转义字符。谢谢,但它仍然将此字符串标识为有效URL,即使其文件名(“.gif”)错误似乎该正则表达式的问题在于,您需要双重转义,因为您正在将正则表达式构建为字符串。这不应该使任何内容暂停,它应该抛出一个错误。组有问题,当然传递到
新RegExp
的字符串中的
\d
不是数字的正则字符类(它只是字母
d
)。正如elclanrs指出的,如果字符串中有它,那么它必须是
\\d
。mmm我应该在哪里将\d改为\\d?在港口排队?它会将此字符串标识为无效URL吗?请参阅您发布的问题中的10票答案,它具有正确的正则表达式,并带有正确的转义字符。谢谢,但它仍然将此字符串标识为有效URL,即使其文件名(“.gif”)错误