Autor Zpráva
Tori
Profil
Pěkný večer,
napsala jsem si funkci, která vrací relativní cestu nebo URL mezi dvěma zadanými. Jak by to šlo napsat líp? Díky moc za názor.
	/**
	 * Porovná dvě cesty nebo URL a vypíše relativní cestu mezi nimi.
	 * @param string $cur Současná adresa/cesta
	 * @param string $new Cílová adresa/cesta
	 * @param string $delim Oddělovač. Výchozí je "/".
	 * @return string
	 */
	function relativePath($cur, $new, $delim='/')	{
	
		$out = '';
		$cur = ltrim($cur, ' /\\');
		$new = ltrim($new, ' /\\');
		$cur = explode($delim, $cur);
		array_pop($cur);
		$new = explode($delim, $new);
		$file = array_pop($new);
	
		/* porovnej delky */
		$lnDiff = count($cur) - count($new);
		/* novy link je delsi */
		if ($lnDiff < 0)	{
			while (++$lnDiff <= 0)	{
				$file = array_pop($new) . $delim . $file;
			}
		/* soucasny link je delsi */
		} elseif ($lnDiff > 0)	{
			while (--$lnDiff >= 0)	{
				$out .= "..$delim";
			}
		}
	
		/* porovnej cesty */
		$tmp = '';
		$ln = count($new);
		for ($i = 0; $i < $ln; $i++)	{
			if ($cur[$i] !== $new[$i])	{
				$out .= str_repeat("..$delim", ($ln-$i)) . implode($delim, $new) . $delim;
				break;
			} else {
				unset($new[$i]);
			}
		}
	
		return ($out === '') ? ".$delim" . $file : $out . $file;
	}
Mastodont
Profil
Takové funkce jsou v manuálu:
http://php.net/manual/en/function.realpath.php
Tori
Profil
Mastodont:
Možná jsem přehlédla existující funkci, ale určitě to není realpath. Jednak realpath je vázaná na filesystem („realpath() returns FALSE on failure, e.g. if the file does not exist.“), ale hlavně funguje právě opačně.
-- toto je URL aktuální stránky:
/clanky/123-nejaky clanek/komentare
-- a chci odkázat na 
/clanky/podleRoku/2010
-- takže potřebuju získat:
../podleRoku/2010
Vím, že bych mohla použít <base>, ale zajímalo mě tohle řešení.
Mastodont
Profil
Tori:
Já nemyslím přímo funkci realpath, ale komentáře k té funkci ... například http://www.php.net/manual/en/function.realpath.php#105876
Tori
Profil
Mastodont:
Oj, do komentářů jsem se nepodívala. Ta odkázaná funkce je rychlejší a podstatně hezčí (přidává navíc jedno "../" kvůli názvu souboru, ale to je maličkost). Děkuju a omlouvám se.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0