通过添加GET参数来操纵urlstring

我想添加GET参数的URL可能和可能不包含GET参数而不重复?&

例:

如果我想添加category=action

 $url="http://www.acme.com"; // will add ?category=action at the end $url="http://www.acme.com/movies?sort=popular"; // will add &category=action at the end 

如果你注意到,如果find了,我不想重复问号。

该URL只是一个string。

附加特定GET参数的可靠方法是什么?

基本方法

 $query = parse_url($url, PHP_URL_QUERY); // Returns a string if the URL has parameters or NULL if not if ($query) { $url .= '&category=1'; } else { $url .= '?category=1'; } 

更先进

 $url = 'http://example.com/search?keyword=test&category=1&tags[]=fun&tags[]=great'; $url_parts = parse_url($url); parse_str($url_parts['query'], $params); $params['category'] = 2; // Overwrite if exists $params['tags'][] = 'cool'; // Allows multiple values // Note that this will url_encode all values $url_parts['query'] = http_build_query($params); // If you have pecl_http echo http_build_url($url_parts); // If not echo $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'] . '?' . $url_parts['query']; 

你至less应该把这个放在一个函数里,如果不是一个类的话。

以下是接受的答案的简短版本:

 $url .= (parse_url($url, PHP_URL_QUERY) ? '&' : '?') . 'category=action'; 

编辑:正如在接受的答案中所讨论的,这是有缺陷的,它不检查是否已经存在category 。 更好的解决scheme是将$_GET作为一个数组来使用,并使用in_array()这样的函数。

 $data = array('foo'=>'bar', 'baz'=>'boom', 'cow'=>'milk', 'php'=>'hypertext processor'); $queryString = http_build_query($data); //$queryString = foo=bar&baz=boom&cow=milk&php=hypertext+processor echo 'http://domain.com?'.$queryString; //output: http://domain.com?foo=bar&baz=boom&cow=milk&php=hypertext+processor 

使用strpos来检测? 既然? 只能出现在一个查询string的开头的URL,你知道,如果它有得到参数已经存在,你需要添加PARAMS使用&

 function addGetParamToUrl(&$url, $varName, $value) { // is there already an ? if (strpos($url, "?")) { $url .= "&" . $varName . "=" . $value; } else { $url .= "?" . $varName . "=" . $value; } } 

该函数覆盖现有的参数

 function addToURL( $key, $value, $url) { $info = parse_url( $url ); parse_str( $info['query'], $query ); return $info['scheme'] . '://' . $info['host'] . $info['path'] . '?' . http_build_query( $query ? array_merge( $query, array($key => $value ) ) : array( $key => $value ) ); } 

更新现有参数的示例。

也使用了url_encode,并且可能不指定参数值

  <? /** * Add parameter to URL * @param string $url * @param string $key * @param string $value * @return string result URL */ function addToUrl($url, $key, $value = null) { $query = parse_url($url, PHP_URL_QUERY); if ($query) { parse_str($query, $queryParams); $queryParams[$key] = $value; $url = str_replace("?$query", '?' . http_build_query($queryParams), $url); } else { $url .= '?' . urlencode($key) . '=' . urlencode($value); } return $url; } 
 $parameters = array(); foreach ($get as $key => $value) { $parameters[] = $key.'='.$value; } $url = 'http://example.com/movies?'.implode('&', $parameters); 

我想你应该这样做。

 class myURL { protected $baseURL, $requestParameters; public function __construct ($newURL) { $this->baseurl = $newURL; $this->requestParameters = array(); } public function addParameter ($parameter) { $this->requestParameters[] = $parameter; } public function __toString () { return $this->baseurl. ( count($this->requestParameters) ? '?'.implode('&', $this->requestParameters) : '' ); } } $url1 = new myURL ('http://www.acme.com'); $url2 = new myURL ('http://www.acme.com'); $url2->addParameter('sort=popular'); $url2->addParameter('category=action'); $url1->addParameter('category=action'); echo $url1."\n".$url2; 
 <?php $url1 = '/test?a=4&b=3'; $url2 = 'www.baidu.com/test?a=4&b=3&try_count=1'; $url3 = 'http://www.baidu.com/test?a=4&b=3&try_count=2'; $url4 = '/test'; function add_or_update_params($url,$key,$value){ $a = parse_url($url); $query = $a['query'] ? $a['query'] : ''; parse_str($query,$params); $params[$key] = $value; $query = http_build_query($params); $result = ''; if($a['scheme']){ $result .= $a['scheme'] . ':'; } if($a['host']){ $result .= '//' . $a['host']; } if($a['path']){ $result .= $a['path']; } if($query){ $result .= '?' . $query; } return $result; } echo add_or_update_params($url1,'try_count',1); echo "\n"; echo add_or_update_params($url2,'try_count',2); echo "\n"; echo add_or_update_params($url3,'try_count',3); echo "\n"; echo add_or_update_params($url4,'try_count',4); echo "\n"; 
  /** * @example addParamToUrl('/path/to/?find=1', array('find' => array('search', 2), 'FILTER' => 'STATUS')) * @example addParamToUrl('//example.com/path/to/?find=1', array('find' => array('search', 2), 'FILTER' => 'STATUS')) * @example addParamToUrl('https://example.com/path/to/?find=1&FILTER=Y', array('find' => array('search', 2), 'FILTER' => 'STATUS')) * @param $url string url * @param array $addParams параметры * @return string */ function addParamToUrl($url, array $addParams) { if(!is_array($addParams)) return $url; $info = parse_url($url); $query = array(); if($info['query']) { parse_str($info['query'], $query); } if(!is_array($query)) $query = array(); $params = array_merge($query, $addParams); $result = ''; if($info['scheme']) $result .= $info['scheme'] . ':'; if($info['host']) $result .= '//' . $info['host']; if($info['path']) $result .= $info['path']; if($params) $result .= '?' . http_build_query($params); return $result; } 

在search这个主题的许多资源/答案之后,我决定编写自己的代码。 基于@ TaylorOtwell的答案在这里,这是我如何处理传入$ _GET请求和修改/操作每个元素。

假设url是: http ://domain.com/category/page.php?a=b&x=y我只想要一个参数进行sorting:?desc = column_name或?asc = column_name。 这样,单个URL参数就足以同时sorting和sorting。 因此,首先点击关联的表头行,url将为http://domain.com/category/page.php?a=b&x=y&desc=column_name

然后我有表格行标题,我想在我的第一次点击DESCsorting和ASC第二次点击相同的标题。 (每次第一次点击应该是“ORDER BY column DESC”第一次)如果没有sorting,默认情况下它将按“date然后id”进行sorting。

您可以进一步改进它,比如您可以为每个$ _GET组件添加清理/过滤function,但下面的结构奠定了基础。

 foreach ($_GET AS $KEY => $VALUE){ if ($KEY == 'desc'){ $SORT = $VALUE; $ORDER = "ORDER BY $VALUE DESC"; $URL_ORDER = $URL_ORDER . "&asc=$VALUE"; } elseif ($KEY == 'asc'){ $SORT = $VALUE; $ORDER = "ORDER BY $VALUE ASC"; $URL_ORDER = $URL_ORDER . "&desc=$VALUE"; } else { $URL_ORDER .= "&$KEY=$VALUE"; $URL .= "&$KEY=$VALUE"; } } if (!$ORDER){$ORDER = 'ORDER BY date DESC, id DESC';} if ($URL_ORDER){$URL_ORDER = $_SERVER[SCRIPT_URL] . '?' . trim($URL_ORDER, '&');} if ($URL){$URL = $_SERVER[SCRIPT_URL] . '?' . trim($URL, '&');} 

(您可以使用$ _SERVER [SCRIPT_URI]作为以http://domain.com开头的完整URL);

然后我在MySQL查询中使用得到的上面得到的$ ORDER:

 "SELECT * FROM table WHERE limiter = 'any' $ORDER"; 

现在,如果有一个先前的sorting,并添加sorting(和sorting)参数到URL与“?” 或“&”按照以下顺序:

  function sort_order ($_SORT){ global $SORT, $URL_ORDER, $URL; if ($SORT == $_SORT){ return $URL_ORDER; } else { if (strpos($URL, '?') !== false){ return "$URL&desc=$_SORT"; } else { return "$URL?desc=$_SORT"; } } } 

最后,在表格行标题中使用该函数:

  echo "<th><a href='".sort_order('id')."'>ID</a></th>"; 

总结:这将读取URL,修改每个$ _GET组件,并使用正确的“?”forms使用您select的参数创build最终的URL。 和“&”

我想这是你要找的东西:

url参数正则expression式

  public function addGetParamToUrl($url, $params) { foreach ($params as $param) { if (strpos($url, "?")) { $url .= "&" .http_build_query($param); } else { $url .= "?" .http_build_query($param); } } return $url; }