3

我一直在研究现在在 Chrome Canary 中实现的新URL 规范,它看起来非常有用。

有什么方法可以在将 URI 传递到URL对象之前对其进行验证?

例如

var urlToCheck = "http//www.google.com";
if(URL.isValid(urlToCheck)) {
    var u = new URL(urlToCheck, baseUrl);
    console.log(u.hostname);
}

我在链接的规范文档中看不到任何内容。我真的不想为了检查 URI 是否有效而处理抛出的异常。

4

3 回答 3

2

您在评论中说您无法判断它是无效的基本 URL 还是 URL,因此您宁愿分别检查它们。如果是这样,为什么不这样做呢?例如,像这样:

URL.isValid = function(url, base) {
  if(base !== undefined) {
    try {
      new URL(base);
    }
    catch(e) {
      return false;
    }
  }
  try {
    new URL(url, base);
    return true;
  }
  catch(e) {
    return false;
  }
});

如果愿意,可以同时检查两者,或者如您所说,分别检查 URL.isValid(base),然后检查 URL.isValid(url, base)。如果第一次检查失败,则说明 base 无效,如果第二次检查失败,则说明 url 无效。如果您真的想要,您可以根据哪个 url 无效从 .isValid 返回单独的错误代码。

于 2013-11-01T16:10:22.527 回答
2

实际上 URL 构造函数的 2 参数版本接受任何东西作为它的第一个参数:

try{
    new URL(null, 'http://www.example.com');
    new URL({ob:'jects',even:{nested:'ones'}}, 'http://www.example.com');
    new URL(['arrays'], 'http://www.example.com');
    new URL(/regexes/, 'http://www.example.com');
    new URL(false, 'http://www.example.com');
    new URL(undefined, 'http://www.example.com');

    console.log('new URL() takes any value as its first parameter!');
}catch(e){}

这意味着您不必验证两个 URL;您只需验证基本 URL。因此,像这样的简单解决方案就足够了:

URL.isValid = function(url) {
    try{
        new URL(url);
    } catch(e) {
        return false;
    }
    return true;
};
于 2013-11-07T15:44:02.190 回答
0

您可以使用此函数来验证 url:

function isValidUrl(url) {
    return url.match(/^(ht|f)tps?:\/\/[a-z0-9-\.]+\.[a-z]{2,4}\/?([^\s<>\#%"\,\{\}\\|\\\^\[\]`]+)?$/);
}
于 2013-10-29T08:56:32.893 回答