Funktion, um Pfade zusammenzubauen
Kai345
- php
[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
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
Ja, gibt es: Perl.
Dann mal raus mit der Sprache: Welche (Core-)Funktionalität meinst du genau?
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
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 ;-)
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. ;)
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
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!
[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
[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
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!
[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
[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