PHP的;从查询字符串中删除单个变量值对

时间:2013-06-15 10:20:01

标签: php

我有一个页面根据众多参数列出项目,即带有值的变量。

listitems.php?color=green&size=small&cat=pants&pagenum=1 etc.

要启用列表编辑,我有一个参数edit = 1,它附加到上面的查询字符串中,以提供:

listitems.php?color=green&size=small&cat=pants&pagenum=1&edit=1

到目前为止一切顺利。

用户完成编辑后,我有一个退出编辑模式的链接。我希望此链接指定整个查询字符串 - 无论它是什么,因为这取决于用户选择 - 除了删除edit = 1.

当我只有几个变量时,我只是在链接中手动列出它们,但现在还有更多变量,我希望能够以编程方式删除edit = 1.

我应该对edit = 1进行某种搜索,然后只替换它吗?

$qs = str_replace("&edit=1, "", $_SERVER['QUERY_STRING']);
<a href='{$_SERVER['PHP_SELF']}?{$qs}'>return</a>;

或者什么是最干净最无差错的方法。

注意:从一个页面到另一个页面我有类似的情况,我想取出pagenum并用另一个替换它。在那里,由于pagenum不同,我不能只搜索pagenum = 1,但如果有任何不同,则必须搜索pagenum =$pagenum

感谢。

3 个答案:

答案 0 :(得分:22)

我使用http_build_query,它很好地接受了一系列参数并正确格式化。您可以从$_GET取消设置编辑参数,并将其余部分推送到此功能中。

请注意,您的代码缺少对htmlspecialchars()的调用。 URL可以包含HTML中活动的字符。因此,在将其输出到链接时:Escape!

一些例子:

unset($_GET['edit']); // delete edit parameter;
$_GET['pagenum'] = 5; // change page number
$qs = http_build_query($_GET);

... output link here.

答案 1 :(得分:3)

这是我的镜头:

/**
*   Receives a URL string and a query string to remove. Returns URL without the query string
*/
function remove_url_query($url, $key) {
    $url = preg_replace('/(?:&|(\?))' . $key . '=[^&]*(?(1)&|)?/i', "$1", $url);
    $url = rtrim($url, '?');
    $url = rtrim($url, '&');
    return $url;
}

返回:

remove_url_query('http://example.com?a', 'a') => http://example.com
remove_url_query('http://example.com?a=1', 'a') => http:/example.com
remove_url_query('http://example.com?a=1&b=2', 'a') => http://example.com?b=2

感谢David Walsh。

答案 2 :(得分:0)

如果edit=1是第一个变量,那么它将无效:

listitems.php?edit=1&color=green&...

您可以使用$_GET变量自行创建查询字符串。类似的东西:

$qs = '';
foreach ($_GET as $key => $value){
    if ($key  == 'pagenum'){
        // Replace page number
        $qs .= $key  . '=' . $new_page_num . '&';
    }elseif ($key  != 'edit'){
        // Keep all key/values, except 'edit'
        $qs .= $key  . '=' . urlencode($value) . '&';
    }
}