我正在尝试使用标识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”
要浏览此代码,我的浏览器会冻结几分钟,但在冻结后会返回一个真值。
关于正则表达式对这两个问题的辩护中缺少什么的任何想法?冻结和错误的返回值?
提前致谢!
答案 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])*
仍然是必需的,否则它将与单个字符不匹配。
?