Javascript URL草案规范验证方法

Javascript URL草案规范验证方法,javascript,parsing,url,Javascript,Parsing,Url,我一直在看现在在Chrome Canary中实现的新功能,它看起来非常有用 在将URI传递到URL对象之前,是否有任何方法验证URI 例如 var urlToCheck = "http//www.google.com"; if(URL.isValid(urlToCheck)) { var u = new URL(urlToCheck, baseUrl); console.log(u.hostname); } 我在链接的规范文档中看不到任何内容。我真的不希望为了检查URI是否有效

我一直在看现在在Chrome Canary中实现的新功能,它看起来非常有用

在将URI传递到
URL
对象之前,是否有任何方法验证URI

例如

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

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

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

function isValidUrl(url) {
    return url.match(/^(ht|f)tps?:\/\/[a-z0-9-\.]+\.[a-z]{2,4}\/?([^\s<>\#%"\,\{\}\\|\\\^\[\]`]+)?$/);
}
函数isValidUrl(url){
返回url.match(/^(ht | f)tps?:\/\/[a-z0-9-\.]+\.[a-z]{2,4}\/?([^\s\\\\\\\\\\\\\\\\\\\[\]`+)$/;
}

您在评论中说,您无法判断是基础URL还是无效的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返回单独的错误代码。

实际上,url构造函数的双参数版本接受任何内容作为其第一个参数:

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;
};

“我真的不想为了检查URI是否有效而处理抛出的异常。”---将其包装在函数中。不幸的是,url和基本url都会抛出TypeError异常,因此我不知道哪个url无效。
new url(”http://www.google.com“,“asd123”)
,URL确实有效,但基不有效。我宁愿单独测试每个URI。在2参数URL构造函数中,基是唯一可能无效的东西。另请参见我的回答这里有一个很好的备忘:我真的不想依赖正则表达式。功能就在那里的某个地方,我想知道我们在哪里以及是否可以使用它这几乎正是我要发布的内容!:)因为除了构造函数本身之外,无法访问URL解析器,至少根据规范中描述的接口,这似乎是最好的方法。