Rolf B: PHP: Textteil finden

Beitrag lesen

Hallo,

tatsächlich ist das Problem MÖGLICHERWEISE mit Hans' Ansatz besser gelöst als mit pathinfo. Der Ansatz, nicht das, was er gezeigt hat. Das ist buggy.

Denn:

pathinfo("bla/foo/datei.txt", PATHINFO_FILENAME) liefert "datei", was richtig ist.

Aber

pathinfo("bla/foo/", PATHINFO_FILENAME) liefert "foo", und über diese Richtigkeit kann man sich streiten, denn unter "bla/foo/" versteht man eigentlich keine Datei, sondern ein Verzeichnis.

Der strrpos-Vorschlag von Hans liefert einen Leerstring. Allerdings muss noch nachgebessert werden, denn Gerhard will ja den Teil ab dem Punkt nicht mehr haben und wenn gar kein Pfadanteil im Dateinamen ist, verwirft Hans den ersten Teil vom Dateinamen. Das zu fixen überlasse ich dem Autor 😉

Aus meiner Sicht ist hier eine Regex brauchbar. Eigentlich ist das schade, denn pathinfo() sollte erkennen, dass sein Parameter auf den Directory Separator endet und dann keinen Dateinamen liefern. Finde ich.

Mein Regex-Vorschlag wäre:

$success = preg_match('/^(?:.*\\'.DIRECTORY_SEPARATOR.')?' .
                         '(?<name>[^.]*)(?:\\..*)?$/', 
                      $datei, $info);

// oder ausführlicher

$success = preg_match('/^(?<pfad>.*\\'.DIRECTORY_SEPARATOR.')?' .
                         '(?<name>[^.]*)(?<extension>\\..*)?$/',
                      $datei, $info);

// und dann: 

$dateiname = $info['name'];

(Umbrüche und Aufteilung der Regex in 2 Strings, damit man das im Forum besser lesen kann)

Die erste Version extrahiert nur den Namen, die zweite Version stellt auch Pfad und Erweiterung in Matchgruppen bereit. Ich habe tatsächlich keine Ahnung, mit welchem String man diese Regex zum Nicht-Matchen bringen könnte, so dass $success==0 herauskommt. Bei einem Leerstring als Input kommt halt ein leerer Name heraus. Möchte man sofort informiert sein, wenn der Name ein Leerstring ist, dann kann man in der name-Gruppe aus dem * ein + machen, in diesem Fall würde $success==0 herauskommen, wenn der Name leer ist (wie z.B. in foo/dat/, aber auch in .htaccess.

Rolf

--
sumpsi - posui - obstruxi