在/上拆分window.location并加入:如果结束于/不添加:

时间:2015-05-26 20:27:33

标签: javascript jquery regex indexof window.location

我正在尝试编写一个if语句来查看URL并根据它执行某些代码块的内容。我遇到的问题是寻找url以/结尾的时间而不是添加:。例如www.site.com/folder/page/ = folder:page:我想要文件夹:page

var winLoc = window.location.href
if(winLoc.indexOf('error') > -1){
winLoc = 'Error:' + document.referrer.replace(/^.+.com/,'').split('/').join(':')
}
else{
winLoc.replace(/^.+.com/,'').split('/').join(':')
}

另外,我不是RegEx的人,因此对答案的解释表示赞赏:]

3 个答案:

答案 0 :(得分:1)

放一个

.replace(/:$/,'')

最后。这很容易,直观和明显,所以我认为它有资格作为“最佳”选项之一。我想您也忘了将结果分配给winLoc ...

我实际上建议减少代码重复,如下所示:

var winLoc=(~location.href.indexOf('error')
  ? 'Error:'+document.referrer
  : location.href)
    .replace(/^(Error:)?.+\.com/,'$1') // Remove URL but keep optional “Error:”
    .replace(/(?:\/)/g,':')
    .replace(/:$/,'');

请注意,.之前com必须转义:\.

无论如何,如果你想要排除起始冒号,你也可以写/ ... \.com(?:\/)/而不是/ ... \.com/(?:)只是非捕获组(即没有特殊含义的组),阻止JS将某些部分解释为注释(//)。

测试代码段:



document.getElementById('tester').addEventListener('change',function(){
  document.getElementById('out').value=separateURLByColons(
    document.getElementById('in1').value,
    document.getElementById('in2').value);
});

document.getElementById('out').value=separateURLByColons(
  document.getElementById('in1').value,
  document.getElementById('in2').value);

function separateURLByColons(input,fallbackReferrer){
  var location_href=input,
    document_referrer=fallbackReferrer;

  var winLoc=(~location_href.indexOf('error')
    ? 'Error:'+document_referrer
    : location_href)
      .replace(/^(Error:)?.+\.com/,'$1') // Remove URL but keep optional “Error:”
      .replace(/(?:\/)/g,':')
      .replace(/:$/,'');
  return winLoc;
}

<div id="tester">
  <code>location.href:</code> <input id="in1" type="text" value="http://example.com/test/path/there/" size="30"/>, <code>document.referrer:</code> <input id="in2" type="text" value="http://example.com/somewhere/" size="30"/>
  <br/>
  Result: <input id="out" type="text"/>
</div>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以使用以下内容:

winLoc = 'Error:' + document.referrer.replace(/^.+\.com\/([^\/]+)\/([^\/]+)\/?/,'$1:$2')

请参阅DEMO

答案 2 :(得分:0)

同样,这是“更好”的问题,但它应该处理你想要做的事情:

var winLoc = window.location;

if (winLoc.href.indexOf('error') < -1) {
    winLoc = 'Error:' + document.referrer.replace(/^.+:\/+[^\/]+\//, "").match(/([^\/]+)/g).join(":");
}
else {
    winLoc = winLoc.pathname.match(/([^\/]+)/g).join(":");
}

可悲的是,document.referrerString而不是URLUtils类型,因此您必须手动剥离文件类型和域(即.replace(/^.+:\/+[^\/]+\//, "")

该正则表达式匹配字符串的开头(^),后跟一个或多个字符(.+),后跟冒号(:),后跟一个或更多斜杠(\/+ ...注意,斜杠被转义),后跟一个或多个非斜杠字符([^\/]+),后跟一个斜杠(\/)。这将匹配多种资源类型(“http”,“https”,“文件”等)以及多种域类型(“。com”,“。org”,“biz”等)。

但是,windows.location IS 来自URLUtils的对象,因此您只需引用pathname属性即可获取域之间的所有内容({ {1}} property)和任何参数(hostname属性)。有关search的更多信息,请访问:https://developer.mozilla.org/en-US/docs/Web/API/URLUtils

在任何一种情况下,URLUtils最终都会成为"www.site.com/folder/page/"

获取目录字符串后,您可以应用单个正则表达式"folder/page/",它将返回与您提供的正则表达式模式匹配的所有值。在这种情况下,即match。 。 。这意味着“任何连续的一组一个或多个非斜线字符”。并且,模式末尾的/([^\/]+)/g标志意味着代码应该捕获所有这些目录级别。

g变为"folder/page/"

所有这些都将以数组形式返回,因此您只需要将["folder", "page"]数组元素放在一起,就可以获得字符串。

join变为["folder", "page"]

现在,有一些警告。 。 。一些网站在搜索网址末尾使用一些非常奇怪的值,可能会导致意外结果(例如,查看Yahoo!重定向),如果网址中有网页(例如,“blah / blah / blah /”) page.html“),该页面也将包含在结果中。

进一步调整可以删除这些,但是,因为它不是你问题的一部分,所以我没有走那条路。