phpbar.de logo

Mailinglisten-Archive

[php] Relativer Pfad zwischen zwei Dateien

[php] Relativer Pfad zwischen zwei Dateien

Roland Tapken php_(at)_phpcenter.de
Sat, 11 May 2002 13:23:59 +0200


Hi!

Am Sat, 11 May 2002 10:23:49 +0200 schrieb "Norbert Pfeiffer"
<norbert_(at)_itbw.de>:
> schaun mer mal:
> http://itbw.de/_tests/diverse/phplist/rel_path.php4
> 
> passt das ?

Ja, das sieht gut aus...

Allerdings habe ich heute Nacht selber noch ne entsprechende Funktion
geschrieben. Liefert im großen und ganzen die selben Ergebnisse,
verarbeitet jedoch auch URLs (brauch ich nicht, hat aber spaß gemacht :D)
und kann auch mit Pfaden umgehen die nicht den selben root haben - dann
hängt die Funktion das Arbeitsverzeichnis davor.

Wollte ich schon früher posten, aber als ich gegen 4.30 Uhr damit fertig
war haben die Batterien meiner (Funk-) Tastatur den Geist aufgegeben :-/

Trotzdem Danke :-)

function relPath($path1, $path2) {
    /**
     * Returns the relative path between two directories.
     **/


    // Get the path elements if the one of
    // the parameters is an URL
    if (preg_match('~^[a-z]+://~i', $path1) OR preg_match('~^[a-z]+://~i',
$path2)) {
        $url1 = parse_url($path1);
        $url2 = parse_url($path2);
        // Everything up to the path have to be the same
        if ( $url1['scheme'] !== $url2['scheme']
            OR $url1['host'] !== $url2['host']
            OR $url1['port'] !== $url2['port']
            OR $url1['user'] !== $url2['user']
            OR $url1['pass'] !== $url2['pass']) {
            return $path2;
        }
        $path1 = $url1['path'];
        $path2 = $url2['path'];
    } else {

        // We need absolute filenames.
        if (substr($path1, 0, 1) != '/') {
            $path1 = getcwd() . '/' . $path1;
        }
        if (substr($path2, 0, 1) != '/') {
            $path2 = getcwd() . '/' . $path2;
        }
    }

    // Strip of a trailing slash
    if (substr($path1, -1, 1) == '/') {
        $path1 = substr($path1, 0, strlen($path1) - 1);
    }
    if (substr($path2, -1, 1) == '/') {
        $path2 = substr($path2, 0, strlen($path2) - 1);
    }

    // Split the Path into its elements
    $comp1 = explode('/', $path1);
    $comp2 = explode('/', $path2);

    // Remove all directories which doesn't differ
    foreach ($comp1 AS $key=>$val) {
        if ($comp1[$key] == $comp2[$key]) {
            unset($comp1[$key]);
            unset($comp2[$key]);
        } else {
            break;
        }
    }

    $relPath = '.';

    // Go down one step for each directory in $comp1
    foreach ($comp1 AS $val) {
        $relPath .= '/..';
    }

    // Go up to every directory in $comp2
    foreach ($comp2 AS $val) {
        $relPath .= '/' . $val;
    }

    return $relPath;
}


cu, Roland Tapken
-- 
Please reply to:  tapken_(at)_engter.de
PGP Public Key: http://www.engter.de/~tapkenea/gnupg_roland.txt
  ~~~ I'm a signature-virus. Please copy me into your sig. ~~~


php::bar PHP Wiki   -   Listenarchive