如何使用PHP从URL中删除任何给定的$ _GET变量?

时间:2015-06-05 20:09:10

标签: php

我将过滤器添加到GET变量的链接中,如下所示:http://example.com/list?size=3&color=7我想在每次选择特定过滤器的不同值时从URL中删除任何给定的过滤器参数,以便例如,它不会像这样重复color过滤器:

http://example.com/list?size=3&color=7&color=1

我怎样才能if(isset($_GET['color'])) { removeGet('color'); }

4 个答案:

答案 0 :(得分:1)

您可以使用parse_urlparse_str来提取参数,如下例所示:

$href = 'http://example.com/list?size=3&color=7';

$query = parse_url( $href, PHP_URL_QUERY );
parse_str( $query, $params );

// set custom paramerets
$params['color'] = 1;

// build query string
$query = http_build_query( $params );

// build url
echo explode( '?', $href )[0] . '?' . $query;

在此示例中,explode()用于在查询字符串之前提取url的一部分,而http_build_query用于生成查询字符串,您还可以使用PECL http_build_url()函数,如果您不能像this问题那样使用PECL替代方案。

答案 1 :(得分:0)

您无法从GET请求中删除变量,只需重定向到没有此变量的地址。

if (isset($_GET['color'])) {
    header ('Location: http://www.example.com/list?size=' . $_GET['size']);
    exit;
}

注意:
在网址http://example.com/list?size=3&color=7&color=1中只有一个$_GET['color'],而不是两个。只有其中一人被带走。您可以检查,$_GET['key']是否存在,但您不知道您的网址中有多少

答案 2 :(得分:0)

所以,假设我正确理解你的问题。
您的情况如下:
  - 您正在构建作为链接放入网页的网址(<a href=)  
- 您正在使用GET语法/标记(URL?key = value&amp; anotherkey = anothervalue)作为分配用户在单击给定链接时接收的某种过滤器的方法

您想要的是能够修改GET参数列表中的一个项目(http://example.com/list?size=3&color=7&color=1),因此您只有一个过滤器键,但您可以修改过滤器值。因此,除了上述内容之外,您还可以:( http://example.com/list?size=3&color=7),但在更改颜色“过滤器”之后,您将改为http://example.com/list?size=3&color=1

此外,您希望在PHP中执行上述操作(与JavaScript等相反...)。

实施变更有很多方法,最有效的方法取决于您已经在做什么,最有可能。
首先,如果你动态生成HTML标记,其中包含带有过滤文本的链接(听起来就是这样),那么最有意义的是创建一个PHP数组来保存你的GET参数,然后编写一个将这些参数转换为GET字符串的函数。
当用户刷新页面时会出现新的过滤器(因为,如果您动态生成HTML,则需要服务器请求来重建页面)。
但是,如果您希望更新实时页面上的链接URL而无需重新加载,请使用JavaScript,这将使您的生活更轻松。
注意:假设链接是硬编码的,可能会修改页面,&amp;该页面是硬编码标记,通过在PHP&amp;中打开页面作为文件。做出适当的改变。这是我的看法,这将是一个令人头痛的问题,不值得花时间和努力和它仍然需要页面重新加载(你不能自己触发)。

<强>摘要
如果你用PHP编写动态页面应该不是什么大问题,只需要创建一个结构(类或数组)和一个方法/函数来将该结构写成GET字符串。然后可以在生成页面之前根据您的需要修改结构。
但是,如果您正在处理静态页面,我建议使用JavaScript(创建js结构以允许用户动态选择过滤器或利用AJAX使用PHP构建新的GET参数列表并将其发送回javascript)。 (注意:我被提醒说,我已经做了一些事情,通过在显示给用户[使用PHP]之前拦截它们来实时修改现有页面的链接,但是我的双手被绑在其他区域,我会如果您有选择则不推荐它并且应该注意这仍然需要重新加载......)

答案 3 :(得分:0)

尝试在后端脚本中执行以下操作:

$originalValues=array();

foreach($_GET as $filter=>$value)
{
   if(empty($originalValues[$filter]))
     $originalValues[$filter] = $value;
}

这可能会做你想要的,但感觉很乱。你可能想要修改你的逻辑。

祝你好运!