【问题标题】:Remove phrase from HTTP_REFERER url in php从 php 中的 HTTP_REFERER url 中删除短语
【发布时间】:2014-01-13 22:20:48
【问题描述】:

我需要使用当前页面的前一个网址,但删除特定的短语。

为了获取之前的 url,我使用了 http_referer 函数,如下所示:

$previousurl = $_SERVER['HTTP_REFERER'];

我需要从该网址的末尾删除短语“?view=listcats”、“?view=listcats-2”

我尝试了以下但没有运气:

$previousurlfull = $_SERVER['HTTP_REFERER'];
$phrase = array("?view=listcats", "?view=listcats-2");
$previousurl = str_replace($phrase, "", $previousurlfull);

提前感谢您的帮助!!!!

【问题讨论】:

标签: php url referer


【解决方案1】:

最好的方法是使用parse_url 作为HTTP_REFERER,然后使用parse_str 作为查询字符串,当然最好进行某种验证以便处理错误。

更新示例 // 这是一个更复杂的示例,但可以让您完全控制。

$previousurlfull = 'http://stackoverflow.com/?view=listcats&sup=1&test=true';
$clean_link = parse_url($previousurlfull);
parse_str($clean_link['query'], $args);

// validation need
$link = $clean_link['scheme'].'://'.$clean_link['host'].$clean_link['path'];

$link .= '?'; // add ? to the beggining 

// use Iterator so you can use hasNext
$iterator = new CachingIterator(new ArrayIterator($args));

foreach($iterator as $k => $v){

    // if doesnt have the view query key
    if($k != 'view'){
            $link .= $k.'='.$v; // insert the key and value

            if($iterator->hasNext()){
                $link .= '&'; // if it has another item on the array insert &
            }
    }
}

echo $link;
// output = http://stackoverflow.com/?sup=1&test=true

工作示例:example


老例子;

 $previousurlfull = 'http://stackoverflow.com/?view=listcats&sup=1&test=true';
 $clean_link = parse_url($previousurlfull); // Parse URL
 parse_str($clean_link['query'], $args); // Parse Query String to an array

 echo '<pre>'; // clean output

 var_dump($clean_link);

 echo $clean_link['scheme'].'://'.$clean_link['host'].$clean_link['path'];

 var_dump($args);

 echo $args['test'];

输出

 array(4) {
  ["scheme"]=>
  string(4) "http"
  ["host"]=>
  string(17) "stackoverflow.com"
  ["path"]=>
  string(1) "/"
  ["query"]=>
  string(29) "view=listcats&sup=1&test=true"
}

echo $clean_link['scheme'].'://'.$clean_link['host'].$clean_link['path']; // example

// $args Query Output
array(3) {
  ["view"]=>
  string(8) "listcats"
  ["sup"]=>
  string(1) "1"
  ["test"]=>
  string(4) "true"
}

工作示例:example

【讨论】:

  • 这可能是它应该处理的方式,但您应该举一个例子来演示如何将数组重新组合在一起以获得用户的完整网址。
  • 是的,但应包括在此处。此外,该示例不包含路径。
  • 虽然这很简单,但获取数组并进行一些简单的连接:),但只是对其进行了编辑!谢谢
  • 如果我想保留所有 GET 参数但不保留 view=listcats 怎么办?如果我想保留&amp;view=listcats 而不是?view=listcats,该怎么办?
  • 您如何认为它不适用于该 URL?用户从未说过他们想保留test=true。最重要的是,您可以进一步分解 URL 的查询部分,而不是通过简单的字符串替换来破坏整个 URL。此外,您可以根据 url 对其进行过滤,因为 google referrer 对保留查询很有用,因为它包含搜索到的关键术语,而本地 referrer 在需要知道查询字符串时几乎没有用处。
【解决方案2】:

或者你可以这样做:

$previousurl = $_SERVER['HTTP_REFERER'];
$new_url=explode("?",$previousurl);
echo $new_url[0];

【讨论】:

  • 在这种情况下似乎是更好的方法。
  • 不幸的是,上述方法均无效。我会尝试更具体。我有一个表,所有行都像这样归档: 以前的网址包括诸如“?view=listcats”、“?view=listcats-2”之类的短语,所以我只需要删除那些特定的短语,而不是“?”之后的所有短语。希望那些对你有帮助。到目前为止,谢谢大家的回答!
【解决方案3】:
$phrases = array("?view=listcats", "?view=listcats-2");
$replace = array('', '');
$previousurl = str_replace($phrases, $replace, $previousurlfull);

【讨论】:

  • 这里有一些问题,主要是示例不起作用,$phrase 从未定义。此外,仅限于两个可能的query 是不好的形式,如果不不断更新其他引荐来源网址可能被传递到具有不同查询值的页面,最终会中断。
  • 哦,第一个是错字,我主要是从一个人的答案中复制的,但想表明你不需要foreach。 OP 要求明确删除这两个字符串,那又如何?
  • 此站点不适用于特定场景,以及如此明确的范围。答案旨在帮助随时通过该网站寻找类似问题的其他人 - 由于范围太窄,您的回答无济于事。此外,仅仅因为某人对他们如何做某事有一个想法并不意味着这是正确的做法;答案应该显示正确的方法,而不是仅仅将空字符串更改为空字符串数组。
  • 如果这个网站不是关于特定问题的,为什么我们有 100000000000 个重复的“如何使用 ajax 获取 PHP 变量”noob 问题?看看这里的其他答案,..没有通用的解决方案,因为问题是具体的。
  • 看看那些问了很多这些问题的用户。他们中的大多数是新用户,不知道如何有效地搜索 - 这不会削弱提供可以帮助其他正在寻找类似内容的人的好答案的能力。与其生气,不如理解有更好的方法来解决问题,而不是用户试图解决问题的方式——生气并坚持不应该解决问题的方式不会帮助任何人.
猜你喜欢
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多