加入相对网址?

hef*_*ump 12 javascript

所以我想在Javascript中使用相对URL连接字符串.

base url =" http://www.adress.com/more/evenmore "

relative url ="../../adress"=>" http://www.adress.com/adress "
relative url ="../adress"=>" http://www.adress.com/more /地址 "

什么是最好的方式?我正在考虑使用正则表达式并检查
我找到多少"../",然后从baseurl中减去该数量并将它们添加到剩下的内容中.

Min*_*ang 11

以下函数分解URL然后解析它.

function concatAndResolveUrl(url, concat) {
  var url1 = url.split('/');
  var url2 = concat.split('/');
  var url3 = [ ];
  for (var i = 0, l = url1.length; i < l; i ++) {
    if (url1[i] == '..') {
      url3.pop();
    } else if (url1[i] == '.') {
      continue;
    } else {
      url3.push(url1[i]);
    }
  }
  for (var i = 0, l = url2.length; i < l; i ++) {
    if (url2[i] == '..') {
      url3.pop();
    } else if (url2[i] == '.') {
      continue;
    } else {
      url3.push(url2[i]);
    }
  }
  return url3.join('/');
}
Run Code Online (Sandbox Code Playgroud)


nin*_*ing 11

8年后,许多浏览器(Internet Explorer除外)都支持URL构造器

> new URL('../address', 'http://www.adress.com/more/evenmore/').href
"http://www.adress.com/more/address"
> new URL('../../address', 'http://www.adress.com/more/evenmore/').href
"http://www.adress.com/address"
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,relative并不是指相对于完整路径,而是相对于最后一个目录路径。`new URL('bar', 'http://example.com/foo)` 将导致 `http://example.com/bar` 而不是 `http://example.com/foo/bar` (5认同)

cbu*_*mer 8

使用URI.js(http://medialize.github.com/URI.js/docs.html#absoluteto):

function joinUrl(baseUrl, url) {
    var theUrl = new URI(url);
    if (theUrl.is("relative")) {
        theUrl = theUrl.absoluteTo(baseUrl);
    }
    return theUrl.toString();
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您必须组合相对 URL,则此库选项有效。因为 ECMAScript 的 URL 会抛出错误: new URL("../the_relative_url", "rel/path/") TypeError: URL constructor: rel/path/ is not a valid URL。 (2认同)

Tho*_*mas 5

URL@ning 提到的 ECMAScript Web API 是一个很好的起点:尤其是因为它在 vanilla JS 实现(Node 等)中可用,并且不需要您使用一个库来执行 nowq 已经完成的实现。查阅 MDN 文档,更具体地说是示例,是一个很好的起点。

直接从他们的文档中借用(有点):

let m = 'https://developer.mozilla.org';

// ... omitted 

let d = new URL('/en-US/docs', m);
Run Code Online (Sandbox Code Playgroud)

如果您要执行上述操作,那么构造对象console.log.toStringURL,您的输出将是:'https://developer.mozilla.org/en-US/docs'

重要的是,如果您查阅文档的语法部分,您会注意到第二个参数是可选的,第二个参数(如上例所示)表示基本URL(尽管仅在提供两个参数的情况下)。

如果两个参数值都是绝对 URL,Web API 会采用第一个并丢弃第二个。

如果您正在使用 Node.js,我鼓励您查看本地路径模块以在相对路径上工作,再次使用库。这里的主要动机是启动你自己的算法(可能只是调用path这里和那里)可能比引入一个库更好您需要的重量很重)。

但是,如果您在前端工作,那么您将无法path使用并且 - 正如@cburgmer 的回答评论中所述 - Web APIURL不支持提到的相对路径情况。在这种情况下,您可能需要寻找一个库来为您完成此操作;然而,再一次,考虑到其他答案,我会考虑尝试一种自制的方法。

值得称赞的是,URI.js目前仅集成了一个非开发人员。依赖性并且没有巨大的足迹。