我正在尝试使用标识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/