N'ayant pas trouvé de fonction permettant de construire une url complète en passant par un tableau, j'ai pris l'initiative la coder rapidemment. Elle se base sur la même structure renvoyée par parse_url().

Description
string build_url ( array $A_url );

Cette fonction retourne une URL, à partir d'un tableau associatif contenant tous les éléments qui la composera. Les URLs partielles sont également acceptées, la fonction build_url() fera de son mieux pour les analyser correctement.

Liste de paramètres

$A_url - L'URL à analyser, tableau associatif, dont les éléments peuvent être (au moins un) :

  • scheme - e.g. http
  • host
  • port
  • user
  • pass
  • path
  • query - après le marqueur de question ?
  • fragment - après la hachure #
Valeurs de retour

string url correctement construite.

Exemples

Exemple 1. Exemple avec parse_url()

<?php
$A_url	= parse_url('http://username:password@hostname:80/path?arg=value#anchor');
print_r($A_url);
 
// modification du chemin de l'url
$A_url['path']	= 'foo/bar.php';
 
echo (build_url($A_url));
?>

L'exemple ci-dessus va afficher :

Array
(
    [scheme] => http
    [host] => hostname
    [port] => 80
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)
http://username:password@hostname:80/foo/bar.php?arg=value#anchor
Code source
function build_url($A_url) {
	$S_url	= '';
	// Sheme eg: http
	if (isset($A_url['scheme'])) {
		$S_url	.= $A_url['scheme'].'://';
	}
	// user:password
	if (isset($A_url['user'])) {
		$S_url	.= $A_url['user'];
		if (isset($A_url['pass'])) {
			$S_url	.= ':'.$A_url['pass'];
		}
		$S_url	.= '@';
	}
	// host
	if (isset($A_url['host'])) {
		$S_url	.= $A_url['host'];
	}
	// port
	if (isset($A_url['port'])) {
		$S_url	.= ':'.$A_url['port'];
	}
	// path (begins with / !!)
	if (isset($A_url['path'])) {
		if (0 !== strpos($A_url['path'], '/')) {
			$A_url['path']	= '/'.$A_url['path'];
		}
		$S_url	.= $A_url['path'];
	}
	// query, after ?
	if (isset($A_url['query'])) {
		$S_url	.= '?'.$A_url['query'];
	}
	// fragment, after #
	if (isset($A_url['fragment'])) {
		$S_url	.= '#'.$A_url['fragment'];
	}
	return $S_url;
}