4

在 php 中,我添加了一个额外的 URL 段?sort以按升序或降序对帖子进行排序。

    <?php
    //get current URL
    $url = "http://" . $_SERVER['HTTP_HOST']  . $_SERVER['REQUEST_URI'];

    //filter URL and create sorting links
    if(filter_var($url, FILTER_VALIDATE_URL))
    { ?>         
      <a href="<?php echo $url; ?>?sort=asc">Small</a>
      <a href="<?php echo $url; ?>?sort=desc">Large</a>
    <?php } ?>

问题:每次我单击链接时,URL 段都会在 URL 中重复。

例子:http://mysite.com/another_segment/?sort=asc?sort=asc?sort=asc

为了禁止重复,当我单击两个排序链接之一时,如何替换 URL 段?我不需要用&符号分隔参数。我期待只有一个分隔符。我在分页脚本中使用它,因此当我浏览页面时参数需要保留在 URL 中。

我也在尝试避免使用 javascript

4

5 回答 5

3

您应该使用以下函数删除现有 URL 中的“排序”键,然后追加。

function remove_querystring_var($url, $key) { 
  $url = preg_replace('/(.*)(?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&'); 
  $url = substr($url, 0, -1); 
  return $url; 
}

你的代码应该这样修改

   <?php
    //get current URL
    $url = "http://" . $_SERVER['HTTP_HOST']  . $_SERVER['REQUEST_URI'];
     $url = remove_querystring_var($url, "sort");
    //filter URL and create sorting links
    if(filter_var($url, FILTER_VALIDATE_URL))
    { ?>         
      <a href="<?php echo $url; ?>?sort=asc">Small</a>
      <a href="<?php echo $url; ?>?sort=desc">Large</a>
    <?php } ?>
于 2012-06-09T00:28:33.950 回答
2

从附加的查询字符串中剥离$url并重建。$_GET&

$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

// Strip the query string from URL
list($url,) = explode('?', $url);

// Remove 'sort' from querystring if exist
if (isset($_GET['sort']))
    unset($_GET['sort']);

// Rebuild query string, append with '&'
$url .= '?'. http_build_query($_GET).(count($_GET) ? '&' : '');

if (filter_var($url, FILTER_VALIDATE_URL))
{ ?>         
    <a href="<?php echo $url; ?>sort=asc">Small</a>
    <a href="<?php echo $url; ?>sort=desc">Large</a>
<?php } ?>

这样,您可以拥有带有查询字符串参数的 URL,但只有一个sort=asc|desc

http://example.com/some/path?page=1&last=1500&sort=asc
http://example.com/some/path?page=1&last=1500&sort=desc
于 2012-06-09T01:11:57.020 回答
1

要从 中剥离查询字符串$_SERVER['REQUEST_URI'],请使用$URI = strstr($_SERVER['REQUEST_URI'], "?", true);.

参考:php.net

于 2012-06-09T00:21:57.877 回答
1
<?php

$get_asc = $get_desc = $_GET;
$get_asc['sort'] = 'asc';
$get_desc['sort'] = 'desc';

if(filter_var($url, FILTER_VALIDATE_URL)) { ?> 
    <a href="<?php echo $url . '?' . http_build_query($get_asc); ?>">Small</a>
    <a href="<?php echo $url . '?' . http_build_query($get_desc); ?>">Large</a>
<?php } ?>
于 2012-06-09T00:51:55.110 回答
0

尝试使用$_SERVER['SCRIPT_NAME']而不是REQUEST_URI.

于 2012-06-09T00:20:30.993 回答