Fonction pour convertir une url relative -> absolue

Contenu du snippet

bonjour,

le simple but de cette fonction est de nettoyer les URL absolues contenant des morceaux d'url relative, en effet à ma connaissance php n'a pas de fonction toute faite pour ça, et j'en avais absolument besoin!!

donc voilà une petite fonction qui converti:
http://www.onlamp.com/pub/q/all_onlamp_articles/../../a/onlamp/2002/../2002/01/24/../../01/24/postgresql.html

en ceci:
http://www.onlamp.com/pub/a/onlamp/2002/01/24/postgresql.html

vous voyez le genre? ;)

Source / Exemple :


<?php

// exemple avec: http://site.com/./files/.././machin/truc.php

//  "."  fait référence au répertoire actuel
//  ".." fait référence au répertoire parent
//  le but du script consiste a supprimer à chaque occurence les deux (le code et le répertoire)

function clean_url($url) {
	
	$p = parse_url($url); // découpe l'url en un sympathique array

	// scheme -> https, ftp, svn...
	// user   -> james, root, anonymous...
	// pass   -> bond, password...
	// host   -> 127.0.0.1, localhost, google.fr...
	// port   -> 80, 21, 1000...
	// path   -> cgi-bin/admin
	// query  -> ?a=b&c=d&e=/f/../g

	if ($p['host'] != "")
	{
		$r = $p['scheme']."://"; // on rajoute le "://" qui a sauté

		if ($p['user'] != "") // dans le cas d'une authentification
		{
			$r .= $p['user'];
	
			if ($p['pass'] != "") $r .= ":".$p['pass']."@";

			$r .= "@";
		}
			
		if ($p['host'] != "")  $r .= $p['host'];
		if ($p['port'] != "")  $r .= ":".$p['port'];

		$url = $r.$p['path'];
		if ($p['query'] != "") $query = "?".$p['query'];

	} 

	$url = str_replace("/./", "/", $url); // résultat ---> http://site.com/files/../machin/truc.php

	while (substr_count($url, "../")) // tand qu'il reste des ../
	{ 
		$url = preg_replace("!/([\w\d]+/\.\.)!","",$url);  // on efface "/(dossier)/.."

	}

	return $url.$query;
}

// on teste avec une vraie url

$adresse = "http://www.onlamp.com/pub/q/all_onlamp_articles/../../a/onlamp/2002/../2002/01/24/../../01/24/postgresql.html?nimp=sd&klk&url=truc.machin.php/path/bizarre/../dsdsd/truc/";

echo "<br \>".$adresse."<br \>".clean_url($adresse);

?>

Conclusion :


je ne suis pas sur que cela soit faisable avec une regex car ça impose pas mal de récursivité mais j'avoue que je ne suis pas expert en la matière ^^ donc si quelqu'un a une manière élégante de faire je serais curieux de voir :)

pour ceux qui se demanderaient l'intérêt d'un tel script vu que la plupart des urls du net osnt cleans, enfait c'est parcequ'en développant un moteur de recherche en php je me suis aperçu qu'il était très simple de copier coller les url relatives trouvées dans une page à l'url de ladite page, et que cela passait, mais ça entraine des problêmes liés à ces étranges url abso-relatives :p

j'ai donc eu besoin de nettoyer tout ça.

(dans php il y "parse_url" qui est géniale pour nettoyer mais ça laisse les url relatives)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.