例如:
你有这个字符串:var x = "/windows/far/away/foo.jpg"
如果该字符串是URL还是否,我现在如何?
我需要做的是:
if (x.charAt(0) == '/') {
x = "http://www.example.com/" + x;
}
else {
x = "http://www.example.com/one/two/three" + x;
}
这里的问题是:当x成为URL时会发生什么?像:
x = "http://www.externalpage.com/foo.jpg";
如您所见,x.charAt(0)
为'h'
,结果为:
http://www.example.com/one/two/threehttp://www.externalpage.com/foo.jpg
现在,解决方案"可能"像这样:
if (is_valid_url( x )) {
....
}
else {
....
}
我正在使用此功能:
function is_valid_url(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和https,这不适用于其他方案,如ftp或其他....
我希望你能理解这个问题并给我一个解决方案。感谢。
答案 0 :(得分:3)
要使其与其他协议一起使用,只需将模式中的https?
替换为与所需协议匹配的表达式,例如:
var pattern = new RegExp('^((http|https|ftp|gopher|ssh|telnet):\/\/)?'+ // protocol
答案 1 :(得分:1)
看起来你实际上想要规范化图像的URL,即你给出的任何字符串,你想要转换为绝对URL。我这样做:
var x = /* insert arbitrary string here */;
var img = document.createElement('img');
img.src = x;
var absoluteUrl = img.src;
让浏览器进行笨拙的工作。
如果这是特定于图片的,您还可以使用img.onload
和img.onerror
事件来检测网址是否引用图片。
答案 2 :(得分:1)
与the answer of Lee Kowalkowski类似,我建议使用<a>
元素“让浏览器为您完成工作”。这意味着不会触发 GET 请求,从而在任何验证步骤中保护您和您的用户免受可能的恶意入侵。但是,它确实意味着你不知道 URL 是否指向一个真实的地方。
function fixURL(str) {
var a = document.createElement('a');
a.href = str;
return a.href;
}
fixURL('foo/bar'); // "https://stackoverflow.com/questions/16295050/foo/bar"
fixURL('/foo/bar'); // "https://stackoverflow.com/foo/bar"
fixURL('ftp://foo/bar'); // "ftp://foo/bar"
在此步骤之后,您可能还想检查已知的“错误”URL(可能是服务器端)。
答案 3 :(得分:0)
将((news|(ht|f)tp(s?)):\/\/)
替换为与news://,http://,https://,ftp://
function is_valid_url(str) {
var pattern = new RegExp('^((news|(ht|f)tp(s?)):\\/\\/)'+ // 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;
}
}
{{1}}