12

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

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

到现在为止还挺好。

当用户完成编辑时,我有一个退出编辑模式的链接。我希望这个链接指定整个查询字符串——不管它是什么,因为这取决于用户的选择——除了删除编辑=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是否有任何区别。

谢谢。

4

4 回答 4

26

我会使用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.
于 2013-06-15T10:30:02.047 回答
8

这是我的镜头:

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

感谢大卫沃尔什。

于 2018-04-28T01:07:23.387 回答
3

另一个解决方案,也可以避免 &amp; 问题!!!

remove_query('http://example.com/?a=valueWith**&amp;**inside&b=value');

代码:

function remove_query($url, $which_argument=false){ 
    return preg_replace('/'. ($which_argument ? '(\&|)'.$which_argument.'(\=(.*?)((?=&(?!amp\;))|$)|(.*?)\b)' : '(\?.*)').'/i' , '', $url);  
}
于 2017-11-29T11:56:05.480 回答
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) . '&';
    }
}
于 2013-06-15T10:28:34.813 回答