Kai345: Funktion, um Pfade zusammenzubauen

[latex]Mae  govannen![/latex]

Gibt es für PHP im „normalen“ Umfang (ohne Frameworks etc.) eine interne Funktion, mit der ich aus verschiedenen Teilen einen Pfad zusammenbauen kann, ohne mich dabei selber um dabei auftretende fehlende/doppelte Slashes kümmern zu müssen?

Würde ich die Teile direkt bzw. mit "/" zusammensetzen, ginge das schief:

"foo" und "bar"   ergibt "foobar"    bzw. "foo/bar"
"foo/" und "bar"  ergibt "foo/bar"   bzw. "foo//bar"
"foo/" und "/bar" ergibt "foo//bar"  bzw. "foo///bar"
"foo" und "/bar"  ergibt "foo/bar"   bzw. "foo//bar"

Es soll immer "foo/bar" zurückgegeben werden.

Wäre zwar kein Problem, mir das als PHP-Funktion SELF zu schreiben, aber wenn es was fertiges und schnelleres gibt...

Cü,

Kai

--
Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". (suit)
Foren-Stylesheet Site Selfzeug JS-Lookup
SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
  1. moin,

    Wäre zwar kein Problem, mir das als PHP-Funktion SELF zu schreiben, aber wenn es was fertiges und schnelleres gibt...

    Ja, gibt es: Perl.

    N' schöne Jroß,
    Hotte

    1. Ja, gibt es: Perl.

      Dann mal raus mit der Sprache: Welche (Core-)Funktionalität meinst du genau?

      1. Ja, gibt es: Perl.

        Dann mal raus mit der Sprache: Welche (Core-)Funktionalität meinst du genau?

        Meinen Kopf natürlich, was denn sonst ;-)

        Ich brauche keine Scriptsprache, die mir das Denken abnimmt, Slashes anhängt, eigenständig HTTP-Header sendet, auf jedem Webserver in einer anderen Version installiert ist und alle paar Tage irgendwelche interessanten Funktionen als deprecated einstuft.

        Das Gegenteil davon ist die Core-Funktionalität von Perl.

        Hotti

        1. Ja, gibt es: Perl.
          Dann mal raus mit der Sprache: Welche (Core-)Funktionalität meinst du genau?
          Meinen Kopf natürlich, was denn sonst ;-)

          Ah, ok. Dann hatte dein Post also null Praxisbezug zum OP, obwohl es sich zunächst so las.

          Auf den Rest gehe ich wegen der immanenten "Hopfen und Malz"-Situation nicht ein ;-)

  2. Tach.

    Gibt es für PHP im „normalen“ Umfang (ohne Frameworks etc.) eine interne Funktion, mit der ich aus verschiedenen Teilen einen Pfad zusammenbauen kann, ohne mich dabei selber um dabei auftretende fehlende/doppelte Slashes kümmern zu müssen?

    Nicht daß ich wüßte. Du könntest zwar realpath dazu mißbrauchen, aber das bringt für Dich evtl. ungewollte Nebenwirkungen mit sich. Außerdem muß der (lokale) Pfad tatsächlich existieren, damit das funktioniert …

    Wäre zwar kein Problem, mir das als PHP-Funktion SELF zu schreiben, aber wenn es was fertiges und schnelleres gibt...

    Läuft wohl auf Selberschreiben hinaus. Wirklich komplex wird das ja nicht, und die Geschwindigkeit leidet darunter sicherlich auch nicht merklich. Es sei denn, Du baust Dir Deine Pfade zeichenweise und mit viel Herumkopiererei zusammen. ;)

    --
    Always remember that you are unique. Just like everybody else.
  3. Hi Kai345!

    Würde ich die Teile direkt bzw. mit "/" zusammensetzen, ginge das schief:

    "foo" und "bar"   ergibt "foobar"    bzw. "foo/bar"
    "foo/" und "bar"  ergibt "foo/bar"   bzw. "foo//bar"
    "foo/" und "/bar" ergibt "foo//bar"  bzw. "foo///bar"
    "foo" und "/bar"  ergibt "foo/bar"   bzw. "foo//bar"

    Es soll immer "foo/bar" zurückgegeben werden.

    trim ( $teil1, "/" );  
    trim ( $teil2, "/" );  
    $pfad = $teil1 . "/" . $teil2
    

    Nur so eine Idee. Ergibt in jedem Fall "foo/bar".

    mfG
    Benjamin

    --
    For animals, the entire universe has been neatly divided into things to (a) mate with, (b) eat, (c) run away from, and (d) rocks.
    1. Hi!

      trim ( $teil1, "/" );

      trim ( $teil2, "/" );
      $pfad = $teil1 . "/" . $teil2

      
      >   
      > Nur so eine Idee. Ergibt in jedem Fall "foo/bar".  
        
      Es geht vermutlich nicht nur um zwei Pfadteile sondern um beliebig viele. Bevor mal sich da tausend Speziallösungen erstellt, wäre es sinnvoll, eine generelle zu finden:  
        
        Zusammensetzen ohne Slash-Berücksichtigung und anschließend preg\_replace('#/{2,}#', '/', $pfad) anwenden  
        
      Klappt für beliebig viele Pfadbestandteile, auch wenn sie schon ungültige Slash-Konstellationen enthalten. Eine weitere Prüfung auf real existierende Dateien/Pfade wäre anschließend noch das schon erwähnte realpath().  
        
        
      Lo!
      
      1. [latex]Mae  govannen![/latex]

        Es geht vermutlich nicht nur um zwei Pfadteile sondern um beliebig viele.

        So ist es.

        Zusammensetzen ohne Slash-Berücksichtigung und anschließend preg_replace('#/{2,}#', '/', $pfad) anwenden

        So ähnlich war auch mein erster Ansatz.

        Allerdings muß ich dabei aufpassen, daß ich die Funktion nicht irgendwann mal zum Zusammenbauen einer URI <del>mißbrauche</del><ins>verwende</ins> :)

        Cü,

        Kai

        --
        Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". (suit)
        Foren-Stylesheet Site Selfzeug JS-Lookup
        SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
        1. [latex]Mae  govannen![/latex]

          Zusammensetzen ohne Slash-Berücksichtigung und anschließend preg_replace('#/{2,}#', '/', $pfad) anwenden

          So ähnlich war auch mein erster Ansatz.

          Allerdings muß ich dabei aufpassen, daß ich die Funktion nicht irgendwann mal zum Zusammenbauen einer URI <del>mißbrauche</del><ins>verwende</ins> :)

          Wäre preg_replace('#(?<!:)/{2,}#', '/', $pfad) hier richtig?

          Cü,

          Kai

          --
          Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". (suit)
          Foren-Stylesheet Site Selfzeug JS-Lookup
          SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
          1. Hi!

            Allerdings muß ich dabei aufpassen, daß ich die Funktion nicht irgendwann mal zum Zusammenbauen einer URI <del>mißbrauche</del><ins>verwende</ins> :)

            Wäre preg_replace('#(?<!:)/{2,}#', '/', $pfad) hier richtig?

            Es ist dann richtig, wenn es sich wunschgemäß verhält. Dazu sollte man Tests mit allen möglichen und unmöglichen Beispielen durchführen.

            Lo!

            1. [latex]Mae  govannen![/latex]

              Wäre preg_replace('#(?<!:)/{2,}#', '/', $pfad) hier richtig?

              Es ist dann richtig, wenn es sich wunschgemäß verhält. Dazu sollte man Tests mit allen möglichen und unmöglichen Beispielen durchführen.

              Das habe ich auch und es scheint soweit zu funktionieren. Aber da RegExp für mich immer noch ein Hassobjekt sind, und ich hier auch immer wieder erlebe, daß in einer scheinbar funktionierenden Expression von RegExperten sofort Fehler gefunden werden, habe ich es gewagt, nachzufragen. Außerdem bin ich bezüglich unmöglicher Beispiele meist ziemlich fantasielos.

              Cü,

              Kai

              --
              Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". (suit)
              Foren-Stylesheet Site Selfzeug JS-Lookup
              SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
  4. [latex]Mae  govannen![/latex]

    Wäre zwar kein Problem, mir das als PHP-Funktion SELF zu schreiben, aber wenn es was fertiges und schnelleres gibt...

    /**  
    * Setzt aus einer beliebigen Anzahl an Argumenten einen Pfad zusammen, dabei werden mehrere  
    * aufeinanderfolgende Schrägstriche (/) zu einem zusammengefasst.  
    * Jedes Argument kann eine Zeichenkette, ein Array oder eine Kombination aus beiden sein.  
    *  
    * @param  string|array  Beliebige Anzahl Pfad-Fragmente  
    * @return string        bereinigter Pfad  
    */  
    function create_path () {  
        $fargs = func_get_args();  
        $path = array();  
        foreach ($fargs as $arg) {  
            if (is_array($arg)) {  
                array_push($path, call_user_func_array(__FUNCTION__, $arg));  
            }  
            elseif (is_string($arg) || is_numeric($arg)) {  
                array_push($path, $arg);  
            }  
        }  
        return preg_replace('#(?<!:)/{2,}#', '/', implode('/',$path));  
    }
    

    getestet mit

    echo create_path("mü","ll","er");  
    echo "<br>",create_path();  
    echo "<br>",create_path(array());  
    echo "<br>",create_path(array("a","b","c"));  
    echo "<br>",create_path("/abc//", array("/def", array(42, "//////",'../..', "hurz"),"ghi"), "jkl////", array('/mno','/pqr/','stu//'), true, "vwx", "yz");
    

    Ausgabe:
    mü/ll/er

    a/b/c
    /abc/def/42/../../hurz/ghi/jkl/mno/pqr/stu/vwx/yz

    Cü,

    Kai

    --
    Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". (suit)
    Foren-Stylesheet Site Selfzeug JS-Lookup
    SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?