Fonction pour convertir une url relative -> absolue

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 982 fois - Téléchargée 30 fois

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

Ajouter un commentaire Commentaires
Messages postés
13
Date d'inscription
jeudi 8 janvier 2004
Statut
Membre
Dernière intervention
21 avril 2009

Le script ne termine pas avec une URL du genre :
http://www.azerty.com/dossier/../../../
(on remonte trop haut dans l'arborescence)
Messages postés
13
Date d'inscription
jeudi 8 janvier 2004
Statut
Membre
Dernière intervention
21 avril 2009

Une magnifique fonction.
Merci beaucoup.
Messages postés
2
Date d'inscription
mardi 2 août 2005
Statut
Membre
Dernière intervention
27 février 2006

ah oui c bcp plus propre comme ça!
faudrait décidement que je m'entraine sur les regxs...
c noté!
Messages postés
5
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
27 février 2006

faire la totalité avec une regexp, c'est certainement délicat mais la partie while, pourquoi pas...
while (substr_count($url, "../")) // tand qu'il reste des ../
{
$url = preg_replace("!/([\w\d]+/\.\.)!",'',$url);
}
Messages postés
5
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
27 février 2006

Bug sur une url un peu louche mais qui fonctionne néanmoins, apache empéchant de remonter plus haut que la racine.
http://monsite.com/../mondossier/monscript.php?adresse=../../bug...
Afficher les 8 commentaires

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.