php;从querystring中删除单个变量值对

php;从querystring中删除单个变量值对,php,Php,我有一个页面,根据许多参数列出项目,即带有值的变量 listitems.php?color=green&size=small&cat=pants&pagenum=1 etc. 为了能够编辑列表,我有一个参数edit=1,它被附加到上面的querystring中,以给出: listitems.php?color=green&size=small&cat=pants&pagenum=1&edit=1 到目前为止还不错 当用户完成编辑时,我有

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

listitems.php?color=green&size=small&cat=pants&pagenum=1 etc.
为了能够编辑列表,我有一个参数edit=1,它被附加到上面的querystring中,以给出:

listitems.php?color=green&size=small&cat=pants&pagenum=1&edit=1
到目前为止还不错

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

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

我是否应该搜索edit=1,然后将其替换为nothing

$qs = str_replace("&edit=1, "", $_SERVER['QUERY_STRING']);
<a href='{$_SERVER['PHP_SELF']}?{$qs}'>return</a>;
$qs=str\u replace(“&edit=1,”,$\u服务器['QUERY\u字符串]);
;
或者什么是最干净、最无错误的方法

注意:当我从一页转到另一页时,我有一个类似的情况,我想取出pagenum并用另一个替换它。因为pagenum不同,所以我不能只搜索pagenum=1,但如果有任何区别,我必须搜索
pagenum=$pagenum


谢谢。

如果
edit=1
是第一个变量,它将不起作用:

listitems.php?edit=1&color=green&...
您可以使用
$\u 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) . '&';
    }
}
我会使用,它可以很好地接受参数数组并正确设置其格式。您可以从
$\u 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.
另一个解决方案,也可以避免
&;
问题!!! 代码:

这是我的照片:

/**
*   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。

我如何从$\u服务器['QUERY\u STRING']执行此操作?有
parse\u url()
parse\u str()
,但$\u GET始终可用并已填充,因此这是不必要的。我不会修改$\u GET变量(或任何超全局变量)因为它们可能在应用程序的其他地方需要。相反,请创建一个临时变量,如
$edit\u query=$\u GET;
。然后可以
取消设置($edit\u query['edit']);
,而不会影响超全局变量。
/**
*   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