Best way to replace query string value in given url

Ok .. so basically, let's say we have a link:

$url = "http://www.site.com/index.php?sub=Mawson&state=QLD&cat=4&page=2&sort=z"; 

Basically, I need to create a function that replaces every thing in the URL, for example:

 <a href="<?=$url;?>?sort=a">Sort by AZ</a> <a href="<?=$url;?>?sort=z">Sort by ZA</a> 

Or, for another example:

 <a href="<?=$url;?>?cat=1">Category 1</a> <a href="<?=$url;?>?cat=2">Category 2</a> 

Or, another example:

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

Basically, we need a function that will replace a specific $_GET URL so that we don't get a duplicate, for example ?page=2&page=3

Having said that, he must be smart, so he knows if the beginning of the parameter is ? or &

We also need it to be smart so that we can have a URL like this:

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

I don't mind creating different variables for each preg_replace for certain $ _GET parameters, but I'm looking for a better way to do this.

Thanks.

+7
source share
8 answers

How about something like that?

 function merge_querystring($url = null,$query = null,$recursive = false) { // $url = 'http://www.google.com.au?q=apple&type=keyword'; // $query = '?q=banana'; // if there a URL missing or no query string, return if($url == null) return false; if($query == null) return $url; // split the url into it 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 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); } 

using...

 <a href="<?=merge_querystring($url,'?page=1');?>">Page 1</a> <a href="<?=merge_querystring($url,'?page=2');?>">Page 2</a> 
+10
source

Well, I had the same problem, found this question and, in the end, preferred my own method. Perhaps he has flaws, then please tell me what it is. My decision:

 $query=$_GET; $query['YOUR_NAME']=$YOUR_VAL; $url=$_SERVER['PHP_SELF']. '?' . http_build_query($query); 

Hope this helps.

+6
source
 <?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); } ?> 

Use this:

 <?php echo change_query($myUrl, array('queryKey'=>'queryValue')); ?> 

I am doing this this morning, it seems to work in all cases. You can modify / add multiple queries with an array;)

+5
source
 function replaceQueryParams($url, $params) { $query = parse_url($url, PHP_URL_QUERY); parse_str($query, $oldParams); if (empty($oldParams)) { return rtrim($url, '?') . '?' . http_build_query($params); } $params = array_merge($oldParams, $params); return preg_replace('#\?.*#', '?' . http_build_query($params), $url); } 

$url examples:

$params example:

 [ 'foo' => 'not-bar', ] 

Note : it does not understand URLs with anchors (hashes), e.g. http://example.com/page?foo=bar#section1

+2
source

If I read this correctly, and I may not. Do you know which GET you are replacing in the url string? It may be messy, but ...

 $url_pieces = explode( '?', $url ); $var_string = $url_pieces[1].'&'; $new_url = $url_pieces[0].preg_replace( '/varName\=value/', 'newVarName=newValue', $var_string ); 

What I take, good luck.

+1
source

I don't know, this is what you are trying to accomplish, but here anyway:

 <?php function mergeMe($url, $assign) { list($var,$val) = explode("=",$assign); //there no var defined if(!strpos($url,"?")) { $res = "$url?$assign"; } else { list($base,$vars) = explode("?",$url); //if the vars dont include the one given if(!strpos($vars,$var)) { $res = "$url&$assign"; } else { $res = preg_replace("/$var=[a-zA-Z0-9_]*(&|$)/",$assign."&",$url); $res = preg_replace("/&$/","",$res); //remove possible & at the end } } //just to show the difference, should be "return $res;" instead return "$url <strong>($assign)</strong><br>$res<hr>"; } //example $url1 = "http://example.com"; $url2 = "http://example.com?sort=a"; $url3 = "http://example.com?sort=a&page=0"; $url4 = "http://example.com?sort=a&page=0&more=no"; echo mergeMe($url1,"page=4"); echo mergeMe($url2,"page=4"); echo mergeMe($url3,"page=4"); echo mergeMe($url4,"page=4"); ?> 
+1
source

improve Scuzzy 2013 function last snippets for clean url query string.

 // merge the query string // array_filter removes empty query array if ($recursive == true) { $merged_result = array_filter(array_merge_recursive($original_query_string, $merged_query_string)); } else { $merged_result = array_filter(array_merge($original_query_string, $merged_query_string)); } // Find the original query string in the URL and replace it with the new one $new_url = str_replace($url_components['query'], http_build_query($merged_result), $url); // If the last query string removed then remove ? from url if(substr($new_url, -1) == '?') { return rtrim($new_url,'?'); } return $new_url; 
+1
source
 <?php //current url: http://localhost/arters?sub=Mawson&state=QLD&cat=4&page=2&sort=a function change_query($queryKey, $queryValue){ $queryStr = $_SERVER['QUERY_STRING']; parse_str($queryStr, $output); $output[$queryKey] = $queryValue; return http_build_query($output); } 

using:

 <a href="?<?=change_query("sort",'z');?>">sort by z</a> 

// http: // localhost / arters? sub = Mawson & state = QLD & cat = 4 & page = 2 & sort = z

 <a href="?<?=change_query("page",'5');?>">Page 5</a> 

// http: // localhost / arters? sub = Mawson & state = QLD & cat = 4 & page = 5 & sort = a

0
source

Source: https://habr.com/ru/post/896937/


All Articles