geloescht_JesterDay Geschrieben 19. Oktober 2006 Geschrieben 19. Oktober 2006 Hi, Ich bin auf der Suche nach einer RegExp, mit der ich Pfad und Dateinamen ausfiltern kann. Zum Verständnis mal ein Beispiel: Ich habe einen String der z.B. so aussieht: /var/tmp/user Nummer/test.txt Den String zerlegt ich mit preg_match_all (php) in die einzelnen Bestandteile (Pfad bzw. Verz.namen und Dateinamen). Fürs erste hab ich folgende RegExp benutzt [\w\s\.]+ Damit also alle Buchstaben, Leerzeichen und den Punkt beachtet. Ein Dateiname kann ja aber noch mehr Zeichen beinhalten. Sonderzeichen (wie z.B. Umlaute) werden so nicht beachtet. Für den Dateinamen sind alle Sonderzeichen bis auf \ / : * ? " < > | zulässig (unter Win zumindest). Ein Ausdruck wie z.B. .*^\^/^: (also alle Zeichen bis auf die angegebenen) geht aber nicht. Hat jemand eine Idee für einen passenden Ausdruck um alle Verz. und Dateinamen zu bekommen? Zitieren
etreu Geschrieben 19. Oktober 2006 Geschrieben 19. Oktober 2006 Was spricht denn gegen die eingebauten Funktionen basename() und dirname()? Mir wäre sonst sowas in den Sinn gekommen: $pattern = "|^(.)*/(.*)$|"; // greedy Zitieren
geloescht_JesterDay Geschrieben 19. Oktober 2006 Autor Geschrieben 19. Oktober 2006 Was spricht denn gegen die eingebauten Funktionen basename() und dirname()? Dass die Dateinamen + Pfade aus einer Logdatei kommen und mit dem Server auf dem das Skript läuft nichts zu tun haben. EDIT: Ok, die Funktion würde wohl gehen, ist ja nicht vom FS abhängig. Ich will aber alle Namen einzeln. Deswegen auch der preg_match_all. Zitieren
etreu Geschrieben 19. Oktober 2006 Geschrieben 19. Oktober 2006 Warum splittest du dann nicht einfach den String mittels explode(). Als Trennzeichen nimmst du DIRECTORY_SEPARATOR. Damit erhälst du alle Teile schön einzeln. Es denn du willst wirklich alles auf einmal. Sonst durchlaufe einfach alle Zeilen in einer Schleife. Zitieren
geloescht_JesterDay Geschrieben 19. Oktober 2006 Autor Geschrieben 19. Oktober 2006 Warum splittest du dann nicht einfach den String mittels explode(). Das hab ich mir auch gerade so überlegt. Die RegExp ist eh in der Configdatei und für jede Installation einstellbar, außerdem wird in die Logdatei wohl auf jeden Fall ein / als Trennzeichen verwendet (Wie es auf einem Windowsserver aussieht konnte mir keiner sagen und testen ging auch nicht). Aber da kann man dann ja das Zeichen in der Config ändern. Manchmal macht man sich eben zu viele komplizierte Gedanken Zitieren
*I C Q* Geschrieben 20. Oktober 2006 Geschrieben 20. Oktober 2006 Hmmm, was mir noch einfallen würde, wäre: /(^.*[\/\\])(.*$)/ Alle Zeichen bis zum letzten / oder \ (also der Pfadname) stehen dann in $1 und der Dateiname in $2. Ist allerdings fast ungetestet! ICQ Zitieren
`kiko Geschrieben 20. Oktober 2006 Geschrieben 20. Oktober 2006 hey wie ein vordermann schon erwähnt hat: $string = "/var/tmp/user Nummer/test.txt"; $file = basename($string); $dir = explode("/",$string); echo "Directories:"; foreach($dir as $key) { echo "; ".$dir." "; } echo "Filename: ".$file; [/php] gruß Zitieren
baba007 Geschrieben 21. Oktober 2006 Geschrieben 21. Oktober 2006 läuft es auf einer Unixmaschine oder Windows ? Zitieren
geloescht_JesterDay Geschrieben 23. Oktober 2006 Autor Geschrieben 23. Oktober 2006 Das Problem ist schon längst gelöst. Es ging mir auch nicht nur um ein "echo "Filename: ".$file; ". @baba007: Es ist egal wo es läuft. Ich hatte für andere Auswertungen der Logeinträge schon RegExp benutzt, kein Problem. Beim Dateinamen (und dem kompletten Pfad) wollte ich dass dann auch so machen. Das Problem war eben, dass viele Zeichen enthalten sein können, aber nicht alle. Ein "/" kann aber auf keinen Fall enthalten sein, und deswegen mach ich es jetzt auch mit Explode (wie oben schon geschrieben). Manchmal denkt man einfach zu kompliziert, wenn man eh schon gerade was in der Art gemacht hat. Der Trenner für Explode kann frei eingestellt werden. Aber das ist eh egal, weil auch auf einem Windows-Server ein "/" in der Log-Datei steht. Das liegt wohl daran, dass das Programm (rsync-Daemon) urspr. aus der Unix-Welt stammt. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.