Javascript 拆分window.location on/and join with:if结束于/don';t加上:
我试图编写一个if语句来查看URL,并根据它执行某些代码块。我遇到的问题是在url以/结尾时查找,而不是添加:。例如www.site.com/folder/page/=folder:page:I-want folder:pageJavascript 拆分window.location on/and join with:if结束于/don';t加上:,javascript,jquery,regex,indexof,window.location,Javascript,Jquery,Regex,Indexof,Window.location,我试图编写一个if语句来查看URL,并根据它执行某些代码块。我遇到的问题是在url以/结尾时查找,而不是添加:。例如www.site.com/folder/page/=folder:page:I-want folder:page var winLoc = window.location.href if(winLoc.indexOf('error') > -1){ winLoc = 'Error:' + document.referrer.replace(/^.+.com/,'').spli
var winLoc = window.location.href
if(winLoc.indexOf('error') > -1){
winLoc = 'Error:' + document.referrer.replace(/^.+.com/,'').split('/').join(':')
}
else{
winLoc.replace(/^.+.com/,'').split('/').join(':')
}
另外,我不是正则表达式的人,所以答案的解释如下:您可以使用以下内容:
winLoc = 'Error:' + document.referrer.replace(/^.+\.com\/([^\/]+)\/([^\/]+)\/?/,'$1:$2')
请参见
.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')。值,
document.getElementById('in2').value);
});
document.getElementById('out')。value=separateURLByColons(
document.getElementById('in1')。值,
document.getElementById('in2').value);
函数分隔符(输入、回退引用){
变量位置\u href=输入,
文件\参考者=后备参考者;
var winLoc=(~location_href.indexOf('error'))
?“错误:”+文档\u引用者
:位置(U href)
.replace(//^(错误:)?。+\.com/,“$1”)//删除URL,但保留可选的“错误:”
.替换(/(?:\/)/g,,:')
.替换(/:$/,'');
返回winLoc;
}
location.href:
,文档。推荐人:
结果:
同样,这是否“更好”值得怀疑,但它应该能够处理您试图做的事情:
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(":");
}
var winLoc=window.location;
if(winLoc.href.indexOf('error')<-1){
winLoc='Error:'+document.referer.replace(/^.+:\/+[^\/]+\/,“”)。match(/([^\/]+)/g)。join(“:”);
}
否则{
winLoc=winLoc.pathname.match(/([^\/]+)/g);
}
遗憾的是,document.referer
是一个String
而不是URLUtils
类型,因此您必须手动剥离文件类型和域(即,.replace(/^.+:\/+[^\/]+\/,“”)
该正则表达式匹配字符串的开头(^
),后跟一个或多个字符(+
),后跟冒号(:
),后跟一个或多个斜杠(\/+
…注意,斜杠被转义),后跟一个或多个非斜杠字符([^\/]+
),后跟一个斜杠(\/
)。这将匹配多个资源类型(“http”、“https”、“文件”等)以及多个域类型(“.com”、“.org”、“biz”等)
但是,windows.location
是一个来自URLUtils
的对象,因此您可以简单地引用pathname
属性来获取域(主机名属性)和任何参数(搜索URLUtils
属性)之间的所有内容。有关URLUtils
的更多信息,请参见此处:
在这两种情况下,“www.site.com/folder/page/”
最终变成了“folder/page/”
获取目录字符串后,您可以应用单个regexmatch
,它将返回与您提供的regex模式匹配的所有值。在这种情况下,即/([^\/]+)/g
…这意味着“一个或多个非斜杠字符的任何连续组”。并且,模式末尾的g
标志意味着代码应该捕获所有这些目录级别
“文件夹/页面/”
变为[“文件夹”,“页面”]
所有这些元素都将在一个数组中返回,因此您只需将数组元素连接在一起,就可以得到字符串
[“文件夹”、“页面”]
变为“文件夹:页面”
现在,有一些警告…一些网站在其搜索URL末尾使用了一些非常奇怪的值,这可能会导致意外的结果(例如,查看雅虎重定向),如果URL中有一个页面(例如,“blah/blah/blah/page.html”),那么该页面也将包含在结果中
进一步的调整可以消除这些,但是,因为这不是你的问题的一部分,我没有走这条路。简单地在最后放一个.replace(/:$/,'')
?而且,.com
应该是\.com
@Xufox足够简单-谢谢。有更好的方法吗?这是最好的方法吗?你可以做winLoc.replace(/^+.com/,‘’)。分裂('/')。过滤器(布尔)。连接('/');< /代码>,但我不认为它一定是“更好”。“RooksRIFE发布了一个答案(可能过于复杂……)。希望,我把一切都解释清楚了。是的,我会认为它是“最好的”。option.Boom是炸药——我认为必须有更好的方法通过正则表达式,而不是替换、拆分、加入、替换。等一下,这是否超出了两个级别…www.site.com/folder/folder/folder/page/?这里需要什么?