Javascript 使正则表达式测试冻结的URL
我试图使用一个正则表达式来标识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 '(\:\
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”)错误