获取相对于javascript中另一个url的url

获取相对于javascript中另一个url的url,javascript,url,Javascript,Url,我想获取相对于另一个url的url 例如 "../d.html".relativeTo("/a/b/c.html"); //==> "/a/d.html" "g.html".relativeTo("/a/b/c.html"); //==> "/a/b/g.html" "./f/j.html".relativeTo("/a/b/c.html"); //==> "/a/b/f/j.html" "../../k/w.html".relativeTo("/a/b/c.html")

我想获取相对于另一个url的url

例如

"../d.html".relativeTo("/a/b/c.html"); //==> "/a/d.html"

"g.html".relativeTo("/a/b/c.html"); //==> "/a/b/g.html"

"./f/j.html".relativeTo("/a/b/c.html"); //==> "/a/b/f/j.html"

"../../k/w.html".relativeTo("/a/b/c.html"); //==> "/k/w.html"

"http://www.google.com".relativeTo("/a/b/c.html"); //==> "http://www.google.com"
我认为有一个简单的解决方案,因为浏览器是针对相对url链接的

我试过了

String.prototype.relativeTo=function(input){
    if(/^https?:\/\//i.test(this)) {
        return this.valueOf();
    }
    else {
        var a = document.createElement("a");
        a.href = input.replace(/\w+\.\w+/, "") + this;
        return a.href;
    }
}
但它返回绝对url


有什么简单的方法可以做到这一点吗?

真的很有趣,无论如何,我想回答一下

String.prototype.startsWith = function (input) {
   return this.substring(0, input.length) === input;
};

String.prototype.relativeTo = function (input) {
   var toTop = /..\//gi;
   var abs = /^https?:\/\//i;
   var inCurrent = './';
   var matches;

   if (abs.test(this)) {
     return this.valueOf();
   }

   function getLastSegmentIndex() {
     return (input.lastIndexOf('/') + 1) - (input.length - 1);
   }

   try {
     matches = this.match(toTop).length;
   } catch (e) {
     matches = 0;
   }

   if (!matches) {
     return input.slice(0, -getLastSegmentIndex()) + this.valueOf();
   } else if (this.startsWith(inCurrent)) {
     return input.slice(0, -getLastSegmentIndex()) +     


     this.replace(inCurrent, '');
   }

   var segments = input.split('/');
   var i = 0;

   for (; i < matches + 1; i++) {
    segments.pop();
   }

   segments.push((this.replace(toTop, '')));
   return segments.join('/');
};
String.prototype.startsWith=函数(输入){
返回此.substring(0,input.length)==input;
};
String.prototype.relativeTo=函数(输入){
var toTop=/..\//gi;
var abs=/^https?:\/\//i;
风险值收益率='。/';
var匹配;
if(abs试验(本)){
返回此.valueOf();
}
函数getLastSegmentIndex(){
返回(input.lastIndexOf('/')+1)-(input.length-1);
}
试一试{
matches=this.match(toTop).length;
}捕获(e){
匹配=0;
}
如果(!匹配){
返回input.slice(0,-getLastSegmentIndex())+this.valueOf();
}else if(此.startsWith(不发生)){
返回input.slice(0,-getLastSegmentIndex())+
此项。替换(不包括“”);
}
var segments=input.split('/');
var i=0;
对于(;i
真的很有趣,无论如何我想回答一下

String.prototype.startsWith = function (input) {
   return this.substring(0, input.length) === input;
};

String.prototype.relativeTo = function (input) {
   var toTop = /..\//gi;
   var abs = /^https?:\/\//i;
   var inCurrent = './';
   var matches;

   if (abs.test(this)) {
     return this.valueOf();
   }

   function getLastSegmentIndex() {
     return (input.lastIndexOf('/') + 1) - (input.length - 1);
   }

   try {
     matches = this.match(toTop).length;
   } catch (e) {
     matches = 0;
   }

   if (!matches) {
     return input.slice(0, -getLastSegmentIndex()) + this.valueOf();
   } else if (this.startsWith(inCurrent)) {
     return input.slice(0, -getLastSegmentIndex()) +     


     this.replace(inCurrent, '');
   }

   var segments = input.split('/');
   var i = 0;

   for (; i < matches + 1; i++) {
    segments.pop();
   }

   segments.push((this.replace(toTop, '')));
   return segments.join('/');
};
String.prototype.startsWith=函数(输入){
返回此.substring(0,input.length)==input;
};
String.prototype.relativeTo=函数(输入){
var toTop=/..\//gi;
var abs=/^https?:\/\//i;
风险值收益率='。/';
var匹配;
if(abs试验(本)){
返回此.valueOf();
}
函数getLastSegmentIndex(){
返回(input.lastIndexOf('/')+1)-(input.length-1);
}
试一试{
matches=this.match(toTop).length;
}捕获(e){
匹配=0;
}
如果(!匹配){
返回input.slice(0,-getLastSegmentIndex())+this.valueOf();
}else if(此.startsWith(不发生)){
返回input.slice(0,-getLastSegmentIndex())+
此项。替换(不包括“”);
}
var segments=input.split('/');
var i=0;
对于(;i
“有什么简单的方法吗”。。。。定义“简单”。让我们看看你试过什么。这不是一个代码编写服务,你需要展示你自己解决问题的尝试……然后当代码不符合预期时,人们会提供帮助我想编写代码来处理字符串并检查这些测试用例,但我认为它应该有简单的解决方案,但关键是你需要编写代码……并在这里提问当您对该代码有问题时。你有很多条件要检查,所以这不是一个简单的练习。您的用例是什么?可能有,但这取决于您试图解决的更高级别的问题。基于这些字符串计算和显示的预期输出…您需要编写自己的parser@jgozal它们通常分为两大类。一个是…我试了一些没用的东西。。。告诉我怎么做--或者——给我代码,我还没试过或做过任何研究。。。那么,少数人是合法的,但几乎没有研究努力的迹象。最好的办法总是设法提示一些投入努力的迹象。措辞不当的问题也很难解释用户的意图,因为这是“有什么简单的方法吗”。。。。定义“简单”。让我们看看你试过什么。这不是一个代码编写服务,你需要展示你自己解决问题的尝试……然后当代码不符合预期时,人们会提供帮助我想编写代码来处理字符串并检查这些测试用例,但我认为它应该有简单的解决方案,但关键是你需要编写代码……并在这里提问当您对该代码有问题时。你有很多条件要检查,所以这不是一个简单的练习。您的用例是什么?可能有,但这取决于您试图解决的更高级别的问题。基于这些字符串计算和显示的预期输出…您需要编写自己的parser@jgozal它们通常分为两大类。一个是…我试了一些没用的东西。。。告诉我怎么做--或者——给我代码,我还没试过或做过任何研究。。。那么,少数人是合法的,但几乎没有研究努力的迹象。最好的办法总是设法提示一些投入努力的迹象。措辞拙劣的问题也很难解释用户的意图,因为这是一个谢谢你的问题。只需将绝对url的“returnthis;”更改为“returnthis.valueOf();”。再次谢谢你,谢谢你。只需将绝对url的“returnthis;”更改为“returnthis.valueOf();”。再次感谢你。