确定路径是相对的还是绝对的

时间:2012-05-14 18:56:31

标签: javascript regex

是否有一个简单的正则表达式来确定路径是相对的还是哈希?

我想匹配这些:

../index.php  
js/funct.js  
./home/
php/file.php?url=http://www.google.com
index.html#about=http://www.google.com

但不是这些:

http://www.google.com
http://google.com
/index.php
/
//google.com
#div4

这是我到目前为止所拥有的:

/^[^#\/]|\/\//.test(url)

但它不起作用。有没有办法让这个工作?

顺便说一下我意识到//google.com在技术上是相对的,但我仍然不想匹配那个案例

我需要这个能够告诉我是否需要在pushState之后处理链接。考虑一下我是/然后pushState d开始/page1/,那么href为'index2.html'的链接应该转到/index2.html,但现在会转到/page1/index2.html

所以我需要检查那些类型的相对路径。

3 个答案:

答案 0 :(得分:1)

不要使用像regexp等低级别的东西。这些东西已经被很多其他人解决了。特别是边缘情况。

看看URI.js,它应该完成这项工作:http://medialize.github.io/URI.js/docs.html#is

var uri = new URI("/example.org/");
uri.is("relative") === true;

答案 1 :(得分:0)

它不应该以斜杠或哈希开头,如果没有问号或哈希,它不应该包含双斜杠?我不会用一个正则表达式来测试它,匹配“没有双斜线”会非常复杂。

function test(s) {
    return s.charAt(0) != "#"
      && s.charAt(0) != "/"
      && ( s.indexOf("//") == -1 
        || s.indexOf("//") > s.indexOf("#")
        || s.indexOf("//") > s.indexOf("?")
    );
}

会更容易,更清晰,也更快。

答案 2 :(得分:0)

上述两种解决方案都无法解决黑客进入redirect_url/\/example.com的{​​{1}}黑客。这是我想出的方法,以确定我们的重定向URL是否是相对的:

/\\/example.com