Fonction pour convertir une url relative -> absolue

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 200 fois - Téléchargée 31 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
pihtt Messages postés 13 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 21 avril 2009
21 avril 2009 à 13:21
Le script ne termine pas avec une URL du genre :
http://www.azerty.com/dossier/../../../
(on remonte trop haut dans l'arborescence)
pihtt Messages postés 13 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 21 avril 2009
16 avril 2009 à 10:08
Une magnifique fonction.
Merci beaucoup.
astropionner Messages postés 2 Date d'inscription mardi 2 août 2005 Statut Membre Dernière intervention 27 février 2006
27 févr. 2006 à 20:56
ah oui c bcp plus propre comme ça!
faudrait décidement que je m'entraine sur les regxs...
c noté!
titerm Messages postés 5 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 27 février 2006
27 févr. 2006 à 09:03
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);
}
titerm Messages postés 5 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 27 février 2006
27 févr. 2006 à 08:21
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.