更好地替换给定URL中的查询字符串值的方法

Lat*_*tox 7 php query-string

好吧..所以基本上,说我们有一个链接:

$url = "http://www.site.com/index.php?sub=Mawson&state=QLD&cat=4&page=2&sort=z";
Run Code Online (Sandbox Code Playgroud)

基本上,我需要创建一个函数,它替换URL中的每个东西,例如:

<a href="<?=$url;?>?sort=a">Sort by A-Z</a>
<a href="<?=$url;?>?sort=z">Sort by Z-A</a>
Run Code Online (Sandbox Code Playgroud)

或者,另一个例子:

<a href="<?=$url;?>?cat=1">Category 1</a>
<a href="<?=$url;?>?cat=2">Category 2</a>
Run Code Online (Sandbox Code Playgroud)

或者,另一个例子:

<a href="<?=$url;?>?page=1">1</a>
<a href="<?=$url;?>?page=2">2</a>
<a href="<?=$url;?>?page=3">3</a>
<a href="<?=$url;?>?page=4">4</a>
Run Code Online (Sandbox Code Playgroud)

基本上,我们需要一个函数来替换$_GETURL中的特定内容,这样我们就不会得到重复内容,例如:?page=2&page=3

话虽如此,它需要是智能的,所以它知道参数的开头是a ?还是a&

我们还需要它是聪明的,以便我们可以像这样拥有URL:

<a href="<?=$url;?>page=3">3</a> (without the ? - so it will detect automatically wether to use an `&` or a `?`
Run Code Online (Sandbox Code Playgroud)

我不介意为每个preg_replace为某些$ _GET参数创建不同的变量,但我正在寻找最佳方法.

谢谢.

Scu*_*zzy 9

这样的事怎么样?

function merge_querystring($url = null,$query = null,$recursive = false)
{
  // $url = 'http://www.google.com.au?q=apple&type=keyword';
  // $query = '?q=banana';
  // if there's a URL missing or no query string, return
  if($url == null)
    return false;
  if($query == null)
    return $url;
  // split the url into it's components
  $url_components = parse_url($url);
  // if we have the query string but no query on the original url
  // just return the URL + query string
  if(empty($url_components['query']))
    return $url.'?'.ltrim($query,'?');
  // turn the url's query string into an array
  parse_str($url_components['query'],$original_query_string);
  // turn the query string into an array
  parse_str(parse_url($query,PHP_URL_QUERY),$merged_query_string);
  // merge the query string
  if($recursive == true)
    $merged_result = array_merge_recursive($original_query_string,$merged_query_string);
  else
    $merged_result = array_merge($original_query_string,$merged_query_string);
  // Find the original query string in the URL and replace it with the new one
  return str_replace($url_components['query'],http_build_query($merged_result),$url);
}
Run Code Online (Sandbox Code Playgroud)

用法...

<a href="<?=merge_querystring($url,'?page=1');?>">Page 1</a>
<a href="<?=merge_querystring($url,'?page=2');?>">Page 2</a>
Run Code Online (Sandbox Code Playgroud)


Ama*_*tel 7

好吧,我有同样的问题,找到了这个问题,最后,我更喜欢自己的方法.也许它有缺陷,那么请告诉我它们是什么.我的解决方案是:

$query=$_GET;
$query['YOUR_NAME']=$YOUR_VAL;
$url=$_SERVER['PHP_SELF']. '?' .  http_build_query($query);
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.


Dou*_*dou 5

<?php
function change_query ( $url , $array ) {
    $url_decomposition = parse_url ($url);
    $cut_url = explode('?', $url);
    $queries = array_key_exists('query',$url_decomposition)?$url_decomposition['query']:false;
    $queries_array = array ();
    if ($queries) {
        $cut_queries   = explode('&', $queries);
        foreach ($cut_queries as $k => $v) {
            if ($v)
            {
                $tmp = explode('=', $v);
                if (sizeof($tmp ) < 2) $tmp[1] = true;
                $queries_array[$tmp[0]] = urldecode($tmp[1]);
            }
        }
    }
    $newQueries = array_merge($queries_array,$array);
    return $cut_url[0].'?'.http_build_query($newQueries);
}
?>
Run Code Online (Sandbox Code Playgroud)

像这样使用:

<?php
    echo change_query($myUrl, array('queryKey'=>'queryValue'));
?>
Run Code Online (Sandbox Code Playgroud)

我今天早上这样做,似乎在所有情况下都有效。您可以使用数组更改/添加多个查询;)