我正在尝试编写一个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的人,因此对答案的解释表示赞赏:]
答案 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;
答案 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.referrer
是String
而不是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“),该页面也将包含在结果中。
进一步调整可以删除这些,但是,因为它不是你问题的一部分,所以我没有走那条路。