我有一个页面根据众多参数列出项目,即带有值的变量。
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
。
感谢。
答案 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) . '&';
}
}