删除PHP中的查询字符串(有时基于引用者)

Cam*_*ron 28 php

嗨,在Facebook上,主链接上有一个查询字符串,如下所示:facebook.com/?ref=home当您单击链接并导航到主页时,查询将自动删除.但是,如果我要手动键入该链接,则不会删除查询.他们是怎么做到的?

net*_*der 83

PHP中最简单的方法:

$url = preg_replace('/\?.*/', '', $url);
Run Code Online (Sandbox Code Playgroud)

以这种方式,Facebook所做的可能是JavaScript的事情:

if (location.href.match(/\?.*/) && document.referrer) {
   location.href = location.href.replace(/\?.*/, '');
}
Run Code Online (Sandbox Code Playgroud)

  • @diyism:这会产生一个E_STRICT错误,因为你通过引用传递一个表达式`array_shift`.请改用"current()". (2认同)

haz*_*haz 32

这是答案的另一个派对技巧:

$url = strtok($url, '?');

如果你想在Code Golf赢得胜利,这就是你想要的答案.它有......

  • 最少的人物
  • 最少的线
  • 最少的函数调用
  • 一个合理的URL,无论是否有查询字符串

  • @Flimm会回答标题中的显式问题,这是涉及此SO问题的每个人都在寻找的内容。鉴于这个问题的年代久远,很难知道FB在2010年是使用Java脚本还是PHP来处理这个问题。但是,如果他们使用PHP处理路由,那么他们将在重新路由之前使用其中一种技术来修剪查询字符串。(尽管按照Yarin的说法,很可能他们使用了JS。) (3认同)

lee*_*ers 20

使用parse_url检查结构良好的网址,同时移除查询字符串:

$link = 'http://facebook.com/page.php?ref=home';
if ($url = parse_url($link)) {
 printf('%s://%s%s', $url['scheme'], $url['host'], $url['path']);
}
Run Code Online (Sandbox Code Playgroud)


hig*_*olt 13

如果没有正则表达式或实际解析URL parse_url,也可以容忍没有查询字符串的URL:

$url = reset((explode('?', $url)));
Run Code Online (Sandbox Code Playgroud)

  • @Chris抱歉.大声笑.应该有额外的parens那里`$ url = reset((explode('?',$ url)));`[例子](http://sandbox.onlinephpfunctions.com/code/3ed64996b6456710ba03e6af60d5b8d658eec76c) (3认同)