从URL中删除两个参数

时间:2016-08-03 15:15:05

标签: php parsing

我有以下代码检查以xz开头的任何参数,如果找到这样的参数,它将仅重定向到同一页面而没有这些参数:

function unparse_url($parsed_url) {
  $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
  $host     = isset($parsed_url['host']) ? $parsed_url['host'] : '';
  $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
  $user     = isset($parsed_url['user']) ? $parsed_url['user'] : '';
  $pass     = isset($parsed_url['pass']) ? ':' . $parsed_url['pass']  : '';
  $pass     = ($user || $pass) ? "$pass@" : '';
  $path     = isset($parsed_url['path']) ? $parsed_url['path'] : '';
  $query    = !empty($parsed_url['query']) ? '?' . trim($parsed_url['query'], '&') : '';
  $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
  return "$scheme$user$pass$host$port$path$query$fragment";
}

function strip_query($url, $query_to_strip) {
  $parsed = parse_url($url);
  $parsed['query'] = preg_replace('/(^|&)'.$query_to_strip.'[^&]*/', '', $parsed['query']);
  return unparse_url($parsed);
}

$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";


$new_url = (strip_query($url, 'xz')); # or whatever query you want to strip/keep


$filtered = array_filter(array_keys($_GET), function($k) {
    return strpos($k, 'xz') === 0;
});

if ( !empty($filtered) ) {
    header ("Location: $new_url");
}

示例:

登陆的用户:domain.com/?xz=1&a=2&xzbo=3将被重定向到domain.com/?a=2

如何针对2种不同的参数模式执行此操作, 例如,以xz开头的任何内容以及以ab开头的任何内容?

1 个答案:

答案 0 :(得分:1)

一个简单的修复可能是定义一个新函数strip_queries

/**
 * @param string $url
 * @param array  $queries the query params to strip
 * @return string
 */
function strip_queries($url, array $queries)
{
    foreach ($queries as $query) {
        $url = strip_query($url, $query);
    }

    return $url;
}

打电话
$new_url = strip_queries($url, array('xz', 'ab'));

你真的应该关注http_build_queryparse_url。有了这些,您可以将查询参数作为数组进行管理,而不是使用字符串操作。