лучший способ заменить значение строки запроса в заданном URL-адресе

Хорошо .. так в основном, скажем, у нас есть ссылка:

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

В принципе, мне нужно создать функцию, которая заменяет каждую вещь в URL, например:

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

Или, для другого примера:

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

Или, еще один пример:

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

Поэтому в основном нам нужна функция, которая заменит конкретный $_GET из URL-адреса, чтобы мы не получили дубликат, например ?page=2&page=3

Сказав это, он должен быть умным, поэтому он знает, является ли начало параметра ? или &

Нам также нужно, чтобы он был умным, чтобы мы могли иметь такой URL:

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

Я не против создания разных переменных для каждого preg_replace для определенных параметров $ _GET, но я ищу лучший способ сделать это.

Спасибо.

Как насчет чего-то подобного?

 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); } 

Применение…

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

Ну, у меня была такая же проблема, нашла этот вопрос и, в конце концов, предпочел мой собственный метод. Возможно, у него есть недостатки, тогда, пожалуйста, скажите мне, что это такое. Мое решение:

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

Надеюсь, поможет.

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

Используйте следующее:

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

Я делаю это сегодня утром, похоже, работает во всех случаях. Вы можете изменить / добавить несколько запросов с массивом;)

 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 примеры:

Пример $params :

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

Примечание : он не понимает URL-адреса с якорями (хэшами), такими как http://example.com/page?foo=bar#section1

Если я читаю это правильно, и я, возможно, не буду. Вы знаете, какие GET вы заменяете в строке url? Это может быть неаккуратно, но …

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

Это мое занятие, удачи.

Я не знаю, это то, что вы пытаетесь выполнить, но здесь все равно:

 <?php function mergeMe($url, $assign) { list($var,$val) = explode("=",$assign); //there's 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"); ?> 

улучшить Scuzzy 2013 функции последних частей для чистой строки запроса url.

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