» Aktuelles Verzeichnis - Alternative zu dirname()

Multiple INSERT mit PDONeuen Thread eröffnenNeue Antwort erstellen<base href> aus HTML-Quelltext auslesen
AutorNachricht
Administrator 

Name: Marc
Geschlecht:
Anmeldedatum: 28.08.2004
Beiträge: 52423
Wohnort: Lohmar


Meine eBay-Auktionen:
19.03.2015, 15:55
zitieren

Mit der Funktion dirname() bekommt man meist mehr Probleme, als man lösen möchte, wenn man sie auf URLs anwendet, wofür die Funktion auch nicht gedacht ist.

Daher habe ich die folgende Funktion realisiert:
function currentdir($url) {
// remove query
if ($first_query = strpos($url, '?')) $url = substr($url, 0, $first_query);
// remove fragment
if ($first_fragment = strpos($url, '#')) $url = substr($url, 0, $first_fragment);
// obtain details
$len = strlen($url);
$last_slash = strrpos($url, '/');
// nothing to do
if ($last_slash === $len) {
return $url;
}
// folder only
// note: "example.com" is only a folder!
if (!$last_slash) {
return '/';
}
// add ending slash to "http://example.com"
if (($first_colon = strpos($url, '://')) !== false && $first_colon + 2 == $last_slash) {
$last_slash = $len;
$url .= '/';
}
$url = substr($url, 0, $last_slash + 1);
return resolvepath($url);
}

Auf dieser Basis funktioniert dann auch parentdir().

Notwendig für currentdir() ist noch resolvepath() um URLs mit "../" korrekt aufzulösen.

Und hier ein Test, der die maßgeblichen Unterschiede zeigt:
$urls = array(
'',
'/',
'//',
'///',
'////',
'foo',
'foo/',
'/foo/',
'a.de',
'go://a.de',
'go://a.de/',
'example.com',
'foo/bar#http://example.com/?foo=http://example.com/',
'foo/bar?http://example.com/#http://example.com/',
'foo/bar?url=http://example.com/',
'foo/bar?url=http%3A%2F%2Fexample.com%2',
'http://example.com',
'http://example.com/',
'http://example.com//',
'http://example.com/foo/bar/',
'http://example.com:80/foo',
'example.com:80/foo',
'http://example.com:80/foo/',
'example.com:80/foo/',
'http://example.com:80/foo/bar/',
'example.com:80/foo/bar/',
'http://example.com/foo/bar//',
'http://example.com/foo//bar//',
'http://example.com/foo//bar/',
'http://example.com/foo/bar/index.php',
'http://example.com/foo/bar//index.php',
'http://example.com/foo//bar//index.php',
);
foreach ($urls as $url) {
echo '$url                         ' . (!$url ? '{empty}' : $url) . PHP_EOL;
echo 'dirname($url)                ' . dirname($url) . PHP_EOL;
echo 'currentdir($url)             ' . currentdir($url) . PHP_EOL;
echo 'parentdir(currentdir($url))  ' . parentdir(currentdir($url)) . PHP_EOL;
echo 'parentdir($url)              ' . parentdir($url) . PHP_EOL;
echo 'parentdir(parentdir($url))   ' . parentdir(parentdir($url)) . PHP_EOL . PHP_EOL;
}

$url                         {empty}
dirname($url)               
currentdir($url)             /
parentdir(currentdir($url))  /
parentdir($url)              /
parentdir(parentdir($url))   /

$url                         /
dirname($url)                /
currentdir($url)             /
parentdir(currentdir($url))  /
parentdir($url)              /
parentdir(parentdir($url))   /

$url                         //
dirname($url)                /
currentdir($url)             //
parentdir(currentdir($url))  /
parentdir($url)              /
parentdir(parentdir($url))   /

$url                         ///
dirname($url)                /
currentdir($url)             ///
parentdir(currentdir($url))  //
parentdir($url)              //
parentdir(parentdir($url))   /

$url                         ////
dirname($url)                /
currentdir($url)             ////
parentdir(currentdir($url))  ///
parentdir($url)              ///
parentdir(parentdir($url))   //

$url                         foo
dirname($url)                .
currentdir($url)             /
parentdir(currentdir($url))  /
parentdir($url)              /
parentdir(parentdir($url))   /

$url                         foo/
dirname($url)                .
currentdir($url)             foo/
parentdir(currentdir($url))  /
parentdir($url)              /
parentdir(parentdir($url))   /

$url                         /foo/
dirname($url)                /
currentdir($url)             /foo/
parentdir(currentdir($url))  /
parentdir($url)              /
parentdir(parentdir($url))   /

$url                         a.de
dirname($url)                .
currentdir($url)             /
parentdir(currentdir($url))  /
parentdir($url)              /
parentdir(parentdir($url))   /

$url                         go://a.de
dirname($url)                go:
currentdir($url)             go://a.de/
parentdir(currentdir($url))  go://a.de/
parentdir($url)              go://a.de/
parentdir(parentdir($url))   go://a.de/

$url                         go://a.de/
dirname($url)                go:
currentdir($url)             go://a.de/
parentdir(currentdir($url))  go://a.de/
parentdir($url)              go://a.de/
parentdir(parentdir($url))   go://a.de/

$url                         example.com
dirname($url)                .
currentdir($url)             /
parentdir(currentdir($url))  /
parentdir($url)              /
parentdir(parentdir($url))   /

$url                         foo/bar#http://example.com/?foo=http://example.com/
dirname($url)                foo/bar#http://example.com/?foo=http:
currentdir($url)             foo/
parentdir(currentdir($url))  /
parentdir($url)              /
parentdir(parentdir($url))   /

$url                         foo/bar?http://example.com/#http://example.com/
dirname($url)                foo/bar?http://example.com/#http:
currentdir($url)             foo/
parentdir(currentdir($url))  /
parentdir($url)              /
parentdir(parentdir($url))   /

$url                         foo/bar?url=http://example.com/
dirname($url)                foo/bar?url=http:
currentdir($url)             foo/
parentdir(currentdir($url))  /
parentdir($url)              /
parentdir(parentdir($url))   /

$url                         foo/bar?url=http%3A%2F%2Fexample.com%2
dirname($url)                foo
currentdir($url)             foo/
parentdir(currentdir($url))  /
parentdir($url)              /
parentdir(parentdir($url))   /

$url                         http://example.com
dirname($url)                http:
currentdir($url)             http://example.com/
parentdir(currentdir($url))  http://example.com/
parentdir($url)              http://example.com/
parentdir(parentdir($url))   http://example.com/

$url                         http://example.com/
dirname($url)                http:
currentdir($url)             http://example.com/
parentdir(currentdir($url))  http://example.com/
parentdir($url)              http://example.com/
parentdir(parentdir($url))   http://example.com/

$url                         http://example.com//
dirname($url)                http:
currentdir($url)             http://example.com//
parentdir(currentdir($url))  http://example.com/
parentdir($url)              http://example.com/
parentdir(parentdir($url))   http://example.com/

$url                         http://example.com/foo/bar/
dirname($url)                http://example.com/foo
currentdir($url)             http://example.com/foo/bar/
parentdir(currentdir($url))  http://example.com/foo/
parentdir($url)              http://example.com/foo/
parentdir(parentdir($url))   http://example.com/

$url                         http://example.com:80/foo
dirname($url)                http://example.com:80
currentdir($url)             http://example.com:80/
parentdir(currentdir($url))  http://example.com:80/
parentdir($url)              http://example.com:80/
parentdir(parentdir($url))   http://example.com:80/

$url                         example.com:80/foo
dirname($url)                example.com:80
currentdir($url)             example.com:80/
parentdir(currentdir($url))  /
parentdir($url)              /
parentdir(parentdir($url))   /

$url                         http://example.com:80/foo/
dirname($url)                http://example.com:80
currentdir($url)             http://example.com:80/foo/
parentdir(currentdir($url))  http://example.com:80/
parentdir($url)              http://example.com:80/
parentdir(parentdir($url))   http://example.com:80/

$url                         example.com:80/foo/
dirname($url)                example.com:80
currentdir($url)             example.com:80/foo/
parentdir(currentdir($url))  example.com:80/
parentdir($url)              example.com:80/
parentdir(parentdir($url))   /

$url                         http://example.com:80/foo/bar/
dirname($url)                http://example.com:80/foo
currentdir($url)             http://example.com:80/foo/bar/
parentdir(currentdir($url))  http://example.com:80/foo/
parentdir($url)              http://example.com:80/foo/
parentdir(parentdir($url))   http://example.com:80/

$url                         example.com:80/foo/bar/
dirname($url)                example.com:80/foo
currentdir($url)             example.com:80/foo/bar/
parentdir(currentdir($url))  example.com:80/foo/
parentdir($url)              example.com:80/foo/
parentdir(parentdir($url))   example.com:80/

$url                         http://example.com/foo/bar//
dirname($url)                http://example.com/foo
currentdir($url)             http://example.com/foo/bar//
parentdir(currentdir($url))  http://example.com/foo/bar/
parentdir($url)              http://example.com/foo/bar/
parentdir(parentdir($url))   http://example.com/foo/

$url                         http://example.com/foo//bar//
dirname($url)                http://example.com/foo
currentdir($url)             http://example.com/foo//bar//
parentdir(currentdir($url))  http://example.com/foo//bar/
parentdir($url)              http://example.com/foo//bar/
parentdir(parentdir($url))   http://example.com/foo//

$url                         http://example.com/foo//bar/
dirname($url)                http://example.com/foo
currentdir($url)             http://example.com/foo//bar/
parentdir(currentdir($url))  http://example.com/foo//
parentdir($url)              http://example.com/foo//
parentdir(parentdir($url))   http://example.com/foo/

$url                         http://example.com/foo/bar/index.php
dirname($url)                http://example.com/foo/bar
currentdir($url)             http://example.com/foo/bar/
parentdir(currentdir($url))  http://example.com/foo/
parentdir($url)              http://example.com/foo/
parentdir(parentdir($url))   http://example.com/

$url                         http://example.com/foo/bar//index.php
dirname($url)                http://example.com/foo/bar
currentdir($url)             http://example.com/foo/bar//
parentdir(currentdir($url))  http://example.com/foo/bar/
parentdir($url)              http://example.com/foo/bar/
parentdir(parentdir($url))   http://example.com/foo/

$url                         http://example.com/foo//bar//index.php
dirname($url)                http://example.com/foo//bar
currentdir($url)             http://example.com/foo//bar//
parentdir(currentdir($url))  http://example.com/foo//bar/
parentdir($url)              http://example.com/foo//bar/
parentdir(parentdir($url))   http://example.com/foo//

Wie man sieht hat dirname() Probleme mit leerem Input, Hostnamen ohne Schrägstrich, mehrfachen Schrägstrichen usw. die ich glücklicherweise mit meiner Funktion lösen konnte.

Ich habe mich bewusst dafür entschieden mehrfache Schrägstriche nicht zu säubern, weil das zu unerwünschten Ergebnissen führen kann. Wer die nicht haben möchte, sollte sie bereits vorher säubern.


pn email
Gast 
19.03.2015, 15:55
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "Aktuelles Verzeichnis - Alternative zu dirname()" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neuen Thread eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
rmdirs() Verzeichnis rekursiv löschen (+ Unterverzeichnisse)
Diese Funktion löscht ein Verzeichnis und dessen Inhalt inkl. aller Dateien und weiterer Unterverzeichnisse: function rmdirs&#40;$dir&#41; &#123; foreach &#40;glob&#40;$dir ....
[PHP]von mgutt
2
3.039
12.08.2019, 12:34
mgutt
Parent-/Eltern-Verzeichnis einer URL ermitteln
Diese Funktion basiert auf currentdir() : function parentdir&#40;$url&#41; &#123; // note&#58; parent of "/" is "/" and parent of "http&#58;//example.com" is "http&#58;//example.com/" //...
[PHP]von mgutt
0
379
01.04.2015, 20:03
mgutt
MP3 Titelanzeige Verzeichnis, Artist und Titel kombinieren?
Hi, es gibt die Möglichkeit bei einer MP3 verschiedene Infos anzeigen zu lassen (habe den Type-S Facelift). Verzeichnisname, Interpret, Titel, Dateiname usw. Leider finde ich keine Option, wo man die Daten kombiniert anzeigen lassen kann. Natürlich...
von mgutt
1
350
22.05.2011, 07:10
mgutt
Das Verzeichnis konnte nicht angelegt werden.
Hallo. Ich bekomme beim Upload von Dateien immer einen Fehler angezeigt: Das Verzeichnis „mwstore://local-backend/local-public/9/93“ konnte nicht angelegt werden. Natürlich ist das nicht 'meine' Domain. Diese lautet familienwortschatz.de. Kann...
von kujawa0708
1
711
06.03.2014, 21:37
mgutt
MediaWiki mit 2 Spachen in einem Wiki (Verzeichnis) Sprache direkt über URL aufrufen?
Hallo, bin gerade dabei aus 2 Wikis eines zu machen. Früher hatten wir ein deutsche und ein englisches. Jetzt habe ich Mediawiki 1.20 neu aufgesetzt und habe alles Daten importiert. Die englischen Seiten lauten z.B. Main_Page die deutsche Seite davon...
von sfab85
39
3.461
23.07.2013, 10:59
mgutt
Alternative zu EJ9?
Gibts eurer Meinung/Erfahrung nach Gebrauchtwagen bis 5000&euro; die man als echte Alternative zum Ej9 bezeichnen kann? Das heißt im Klartext: -Verbrauch unter 7l auch wenn mans gelegentlich krachen lässt -hohe Zuverlässigkeit -Steuer und...
von DeeLoc
37
1.445
08.08.2012, 15:06
Electric
ASB vom MC1 als Alternative zur y8?!
Ist wohl baugleich, aber aus Kunststoff. Ergo leichter. Bringt sie noch andere Vorteile? Hat wer Erfahrungen sammeln...
von Asimo1980
4
257
02.03.2019, 09:17
Blues
ma9 esd alternative ?
Hey Leute mal Ne kurze Frage passt der ej/ek oder der eg esd plug&play auf einem ma9 ? Der Tüv hat bei meinem Bruda wegen dem esd...
von Eg-H22
2
152
20.07.2012, 18:13
Eg-H22
MB alternative zu EJ6 ???
Also ich bin ja schon seit ewig auf der suche nach einen ej6, aber das passende zu finden ist echt verdammt schwer und ich verliere langsam die lust. Ich habe jetzt auch mal nach anderen modelen gesucht und habe da einen MB (1 glaube ich) gefunden. Der...
von Godsmack
23
1.106
13.04.2008, 12:43
civic_mc2
Alternative zu RHD
Mahlzeit. Hat jemand Erfahrungen mit anderen Firmen zwecks Sondereintragungen gemacht? RHD ist zwar anscheinend die erste Anlaufstelle bei unmöglichen Sachen, aber muss doch sicher noch andere Firmen geben, wo es hieb und stichfeste Eintragungen...
von Matze B
13
1.136
17.06.2015, 16:16
Hennessy*19*
© 2004 - 2025 www.programmierer-forum.de | Communities | Impressum |