我需要比较网址路径名,以确定两个浏览器是否正在查看同一页面。我使用document.location.pathname
来获取URL的路径名组件,我的问题是这种比较必须非常宽容。
示例1: document.location.pathname
被视为“同一页面”的值:
1. /subfolder/index.html
2. /subfolder/
3. /subfolder
4. /subfolder/index.html?something=something#somewhere
示例2:第二组路径名值是同一页面,这次没有子文件夹:
1. /
2. /index.html
3.
在第二个例子中,#3几乎没有;路径名可能为零,但服务器仍会在尝试解析资源说明符时添加“index.html”。
当从URL中省略文件时,该页面可以是任何index.[something]
页面。它可能是index.php,index.aspx,index.html,index.htm等。index.html
和index.php
无法匹配。虽然/somefolder/about.html
可能与/somefolder
匹配,但/somefolder/index.php
也不能与/somefolder
匹配。 (你明白了)。
我可以编写大量的JavaScript来实现这一点,但我知道必须有一个很好的,简洁的方法来使用RegEx。谷歌搜索只是“如何匹配网格模式与正则表达式”垃圾,这是没有太大帮助。
我希望精通RegEx的人可以提供帮助。谢谢。
仅限纯JavaScript解决方案。没有jQuery或其他库;在这种情况下,我无法访问它们。
答案 0 :(得分:0)
您需要的是以下正则表达式
\/((subfolder\/?(index\.\w+.*)?)|index\.\w+?)?$
并将其包装在一个函数
中function isValid(url){
var rgx = /\/((subfolder\/?(index\.\w+.*)?)|index\.\w+?)?$/;
return url == "" || rgx.test(url);
}
正则表达式使用捕获组和|
运算符含义或和?
来使先前的标记可选。最后一个测试用例是在不使用正则表达式的情况下处理的。
只需替换我的正则表达式中的subfolder
即可。然后很容易知道两条路径是否相同
var areTwoPagesAreEqual = isValid("first path") == isValid("second path")
答案 1 :(得分:0)
您的所有方案都与
匹配var regex = /^\/subfolder\/?(?:index\.html(?:.*)?)?$/