Trouver un chemin d'acces relatif

Contenu du snippet

Cette petite fonction permet de créer un chemin d’accès relatif à partir de deux chemins d'accès absolus.

Source / Exemple :


<?
if (!function_exists("path_rewrite")) {

	function path_rewrite($path_from, $path_to, $from_file, $to_file, $control = TRUE) {

		//chemin d'acces qui sera retourné
		$path_final = array();

		//on change tous les "\" en "/"
		$path_from	= str_replace("\\", "/", $path_from);
		$path_to	= str_replace("\\", "/", $path_to);

		//on supprime l'antislash final si il y a
		$path_from	= ereg_replace("/$", "", $path_from);
		$path_to	= ereg_replace("/$", "", $path_to);

		//on ajoute le / au debut si nesessaire
		if (!$control) {
			$path_from	= ereg_replace("^/?", "/", $path_from);
			$path_to	= ereg_replace("^/?", "/", $path_to);
		}

		//on split les url repertoire par repertoire
		$path["from"]	= explode("/", $path_from);
		$path["to"]	= explode("/", $path_to);

		if ($from_file)	array_pop($path["from"]);
		$to_file = ($to_file) ? array_pop($path["to"]) : "";

		//on regarde leur racine commune
		for ($root = 0; $root < count($path["from"]), $root < count($path["to"]); $root++) {
			if ($path["from"][$root] != $path["to"][$root]) break;
		}

		if ($control && $root == 0) return 0;

		//on construit le chemin d'acces
		if (count($path["from"]) == $root) {
			$path_final[] = ".";
		} else {
			$path_final = array_pad($path_final, count($path["from"]) - $root, "..");		
		}

		for ($i = $root; $i < count($path["to"]); $i++) $path_final[] = $path["to"][$i];

		return (implode("/", $path_final) . "/" . $to_file);
	}
}
?>

Conclusion :


function path_rewrite(string from, string to, bool from_file, bool to_file, [bool control])

Arguments:
from et to sont deux chemins d'accès absolus. From est le répertoire ou le fichier d'où l'on part, to est le fichier ou répertoire ou l'on va.
From_file indique si le chemin d'accès From est celui d'un fichier (TRUE) ou celui d'un répertoire (FALSE).
To_file indique si le chemin d'accès To est celui d'un fichier (TRUE) ou celui d'un répertoire (FALSE).
Control. Vaut TRUE si la fonction doit vérifier qu'on peut bien passer de from à to. Vaut FALSE si on sous entend qu'on peut accéder de from à to. Par défaut vaut TRUE.

Quelques exemples pour faire passer la pilule :)

path_rewrite("a/", "a/b/c/", FALSE, FALSE);
Retournera "./b/c/"

path_rewrite("a/b/c", "a/", FALSE, FALSE);
Retournera "../../"

path_rewrite("a/b", "a/d/f", FALSE, FALSE);
Retournera "../d/f/"

path_rewrite("/a/fichier1.php", "a/b/fichier2.php", TRUE, TRUE)
Retournera "0" car a/b/fichier2.php est un chemin d'accès relatif

path_rewrite("/a/fichier1.php", "a/b/fichier2.php", TRUE, TRUE, FALSE)
Retournera "./b/fichier2.php" : control est FALSE revient au même de faire :
path_rewrite("/a/fichier1.php", "/a/b/fichier2.php", TRUE, TRUE)

Quelques infos:
-le script fonctionne aussi bien avec des "/" que des "\"
-le trailing slash n'est pas utile grâce à from_file et à to_file
-le if (!function_exists("path_rewrite")) { peut être utile si vous n'utilisez pas un include_one()

Bon en fin de compte j'espere que m'aurez compris... (J'explique mal je sais) enfin bref hésitez pas a poser vos questions ! ;)

A bientôt !

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.