This function 'parse_rebuild_url' will parse and reassemble your URL with new values provided by the 'overwrite_parsed_url_array' back together.It is also possible to overwrite the URL components by key name and to merge or overwrite query parameters.<?php $test_url = 'http://usr:pss@example.com:81/mypath/myfile.html?a=b&b[]=2&b[]=3&z=9#myfragment'; $new_url_01_overwrite_query_params = parse_rebuild_url( $test_url, array( 'host' => 'new-hostname.tld', 'query' => array( 'test' => 'Hello World', 'a' => array( 'c', 'd' ), 'z' => 8 ), 'fragment' => 'new-fragment-value' ), false ); $new_url_02_mergewith_query_params = parse_rebuild_url( $test_url, array( 'query' => array( 'test' => 'Hello World', 'a' => array( 'c', 'd' ), 'z' => 8 ), 'fragment' => 'new-fragment-value' ), true ); function parse_rebuild_url( $url, $overwrite_parsed_url_array, $merge_query_parameters = true ) { $parsed_url_array = parse_url( $url ); $parsed_url_keys_array = array( 'scheme' => null, 'abempty' => isset( $parsed_url_array['scheme'] ) ? '://' : null, 'user' => null, 'authcolon' => isset( $parsed_url_array['pass'] ) ? ':' : null, 'pass' => null, 'authat' => isset( $parsed_url_array['user'] ) ? '@' : null, 'host' => null, 'portcolon' => isset( $parsed_url_array['port'] ) ? ':' : null, 'port' => null, 'path' => null, 'param' => isset( $parsed_url_array['query'] ) ? '?' : null, 'query' => null, 'hash' => isset( $parsed_url_array['fragment'] ) ? '#' : null, 'fragment' => null ); if ( isset( $parsed_url_array['query'] ) && $merge_query_parameters === true ) { parse_str( $parsed_url_array['query'], $query_array ); $overwrite_parsed_url_array['query'] = array_merge_recursive( $query_array, $overwrite_parsed_url_array['query'] ); } $query_parameters = http_build_query( $overwrite_parsed_url_array['query'], null, '&', PHP_QUERY_RFC1738 ); $overwrite_parsed_url_array['query'] = urldecode( preg_replace( '/%5B[0-9]+%5D/simU', '%5B%5D', $query_parameters ) ); $fully_parsed_url_array = array_filter( array_merge( $parsed_url_keys_array, $parsed_url_array, $overwrite_parsed_url_array ) ); return implode( null, $fully_parsed_url_array ); }