Fonction pour convertir une url relative -> absolue

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 598 fois - Téléchargée 29 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

coucou747
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
27 -
Salut, tu mélange les doubles quotes et les simples...
tu fais comment si t'as :

http://monsite.com/mondossier/monscript.php?adresse=../../bug...
astropionner
Messages postés
2
Date d'inscription
mardi 2 août 2005
Statut
Membre
Dernière intervention
27 février 2006
-
voilà j'ai corrigé merci ;)

normalement moi je fais ça directement dans mon script (j'applique ma fonction sur l'url "vierge" et non la query, que je rajoute après)

mais c vrai que tout le monde ne s'en servira pas dans un script complexe de reroutage d'url utilisant déjà parse_url, donc voilà j'ai ajouté un script basique pour filtrer pour servir d'exemple
TheSin
Messages postés
331
Date d'inscription
mardi 12 novembre 2002
Statut
Membre
Dernière intervention
10 février 2009
-
j'ai pas testé, mais ça ma l'air très intéressant et pas mal utile dans certains cas :)
jmet 9/10 parce que jamais rien n'est parfais :-P
titerm
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...
titerm
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);
}

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.