0

例如:

你有这个字符串: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)is'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 或其他....

我希望你能理解这个问题并给我一个解决方案。谢谢。

4

4 回答 4

3

要使其与其他协议一起使用,只需https?在模式中替换为与您想要的任何协议匹配的表达式,例如:

var pattern = new RegExp('^((http|https|ftp|gopher|ssh|telnet):\/\/)?'+ // protocol
于 2013-04-30T08:14:09.013 回答
1

看起来您实际上想要规范化图像的 URL,即无论您给出什么字符串,您都想要转换为绝对 URL。我会这样做:

var x = /* insert arbitrary string here */;
var img = document.createElement('img');
img.src = x;
var absoluteUrl = img.src;

让浏览器完成繁重的工作。

如果这是特定于图像的,您还可以使用img.onloadimg.onerror事件来检测 URL 是否引用图像。

于 2013-04-30T08:24:17.467 回答
1

与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(可能在服务器端进行)。

于 2013-04-30T08:40:58.340 回答
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;
  }
}
于 2013-04-30T08:16:15.347 回答