正则表达式比较网址"功能相同"

时间:2015-01-14 05:51:10

标签: javascript html regex url

问题

我需要比较网址路径名,以确定两个浏览器是否正在查看同一页面。我使用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. 

重要说明:

  1. 在第二个例子中,#3几乎没有;路径名可能为零,但服务器仍会在尝试解析资源说明符时添加“index.html”。

  2. 当从URL中省略文件时,该页面可以是任何index.[something]页面。它可能是index.php,index.aspx,index.html,index.htm等。index.htmlindex.php无法匹配。虽然/somefolder/about.html可能与/somefolder匹配,但/somefolder/index.php也不能与/somefolder匹配。 (你明白了)。


  3. 我需要什么

    我可以编写大量的JavaScript来实现这一点,但我知道必须有一个很好的,简洁的方法来使用RegEx。谷歌搜索只是“如何匹配网格模式与正则表达式”垃圾,这是没有太大帮助。

    我希望精通RegEx的人可以提供帮助。谢谢。

    NB:

    仅限纯JavaScript解决方案。没有jQuery或其他库;在这种情况下,我无法访问它们。

2 个答案:

答案 0 :(得分:0)

您需要的是以下正则表达式

\/((subfolder\/?(index\.\w+.*)?)|index\.\w+?)?$

并将其包装在一个函数

function isValid(url){
   var rgx = /\/((subfolder\/?(index\.\w+.*)?)|index\.\w+?)?$/;
   return url == "" || rgx.test(url);
}

正则表达式使用捕获组和|运算符含义?来使先前的标记可选。最后一个测试用例是在不使用正则表达式的情况下处理的。

DEMO

只需替换我的正则表达式中的subfolder即可。然后很容易知道两条路径是否相同

var areTwoPagesAreEqual = isValid("first path") == isValid("second path")

答案 1 :(得分:0)

您的所有方案都与

匹配
var regex = /^\/subfolder\/?(?:index\.html(?:.*)?)?$/