/** * @brief Inject query into an URL string * * @param string $url * @param array $query Associative array containing query * @return string Altered URL */ function buildUrl($url, array $query = null) { if (!empty($query)) { // Cleanup the input array to prevent empty Keys foreach ($query as $k => $v) { if (empty($k)) { unset($query[$k]); } } # Parse the url to get a query string $parsed = parse_url($url); # If a query string is set, parse it into an associative array (..&key=value => array("key" => "value")) if (isset($parsed["query"]) && strlen($parsed["query"]) > 0) { $newQuery = array(); $pairs = explode("&", $parsed["query"]); foreach ($pairs as $pair) { list($key, $val) = explode("=", $pair, 2); $newQuery[$key] = urldecode($val); } # Add/Replace parameters from $query $newQuery = array_replace($newQuery, $query); } else { $newQuery = $query; } $parsed["query"] = http_build_query($newQuery); # Rebuild the query back $url = httpBuildUrl($parsed); } return $url; }
public function testHttpBuildUrl() { $parts = ["scheme" => "https", "user" => "user", "pass" => "pass", "host" => "test.com", "port" => 8080, "path" => "path", "query" => "var1=val1&var2=val2", "fragment" => "fragment"]; $this->assertEquals("https://*****:*****@test.com:8080path?var1=val1&var2=val2#fragment", httpBuildUrl($parts)); }