【问题标题】:Yet Another document.referrer.pathname Thing又一个 document.referrer.pathname 东西
【发布时间】:2012-11-21 00:44:23
【问题描述】:

我正在寻找“document.referrer.pathname”的等价物。我知道在 SO 上还有其他与此类似的问题,但没有一个能处理所有用例。例如:

http://example.com/RESULT

http://example.com/RESULT/

http://example.com/RESULT?query=string

所有示例都应返回:

RESULT

https://example.com/EXTENDED/RESULT/

EXTENDED/RESULT

有些人可能希望包含尾部斜杠,但我不希望,因为我正在匹配引用列表。

我已经开始了:

document.referrer.match(/:\/\/.*\/(.*)/)[1]

并且正在努力添加查询字符串解析。

谢谢!

【问题讨论】:

    标签: javascript regex referrer


    【解决方案1】:

    如果您将 URL 作为字符串,您可以创建空锚并将 URL 作为 href 提供给它们以访问路径名:

    var url = 'http://example.com/RESULT?query=string', // or document.referrer
        a = document.createElement('a');
    a.href = url;
    var result = a.pathname.replace(/(^\/|\/$)/g,'');
    

    我在这里为你设置了一个测试示例:http://jsfiddle.net/eWydy/

    【讨论】:

      【解决方案2】:

      试试这个正则表达式:

      .match(/\/\/.*?\/(.*?)\/?(\?.*)?$/)[1]
      

      DEMO

      【讨论】:

      • 这行得通,但在这种情况下会留下斜杠:http://example.com/RESULT/?query=string,这对某些人来说可能是可取的,但不是我的需要。不过谢谢!
      • 只是将斜杠移到第二个子表达式之外似乎可以解决它:/\/\/.*?\/(.*?)\/(\?.*)?$/ --- 嗯,不,没有查询字符串就掉下来了。
      • 好的,最终答案似乎是:/\/\/.*?\/(.*?)\/?(\?.*)?$/
      【解决方案3】:

      如果您不想为其创建新元素或依赖a.pathname,我建议使用indexOfslice

      function getPath(s) {
          var i = s.indexOf('://') + 3, j;
          i = s.indexOf('/',i) + 1;  // find first / (ie. after .com) and start at the next char
          if( i === 0 ) return '';
          j = s.indexOf('?',i); // find first ? after first / (as before doesn't matter anyway)
          if( j == -1 ) j = s.length; // if no ?, use until end of string
          while( s[j-1] === '/' ) j = j - 1; // get rid of ending /s
          return s.slice(i, j); // return what we've ended up at
      }
      getPath(document.referrer);
      

      如果你想要正则表达式,也许这个

      document.referrer.match(/:\/\/[^\/]+[\/]+([^\?]*)[\/]*(?:\?.*)?$/)[1]
      

      它确实“找到第一个://,一直到下一个/,然后获取不是?的所有内容,直到?或最后一个/或字符串结尾并捕获它",和我上面做的功能基本一样。

      【讨论】:

      • 就像@depot 的正则表达式一样,这个正则表达式也留下了斜杠。没什么大不了的,因为如果需要,我可以在之后剥离它,但我希望找到一种方法来在一个正则表达式中完成所有事情。我的想法是,一旦你从一个正则表达式开始,总是一个正则表达式;-)
      猜你喜欢
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 2014-05-11
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      相关资源
      最近更新 更多