Wer mit Dateien arbeitet, braucht oft einzelne Bestandteile eines Pfades: nur den Dateinamen, nur die Endung oder nur das Verzeichnis. Die Funktion pathinfo() zerlegt einen Pfad in einem einzigen Aufruf in alle vier Teile.
Grundlegende Verwendung
Ohne weitere Parameter gibt pathinfo() ein assoziatives Array mit vier Einträgen zurück:
<?php
$pfad = '/var/www/html/bilder/foto.jpg';
$info = pathinfo($pfad);
echo $info['dirname']; // /var/www/html/bilder
echo $info['basename']; // foto.jpg
echo $info['extension']; // jpg
echo $info['filename']; // foto
?>
Die vier Schlüssel sind immer gleich: dirname für das Verzeichnis, basename für den vollständigen Dateinamen, extension für die Endung und filename für den Namen ohne Endung.
Einzelne Bestandteile gezielt abfragen
Wenn nur ein bestimmter Teil gebraucht wird, kann der zweite Parameter eine PATHINFO_*-Konstante erhalten. Dann gibt die Funktion direkt einen String statt eines Arrays zurück:
<?php
$pfad = '/uploads/dokumente/rechnung.pdf';
echo pathinfo($pfad, PATHINFO_EXTENSION);
/* Ausgabe: pdf */
echo pathinfo($pfad, PATHINFO_FILENAME);
/* Ausgabe: rechnung */
echo pathinfo($pfad, PATHINFO_DIRNAME);
/* Ausgabe: /uploads/dokumente */
echo pathinfo($pfad, PATHINFO_BASENAME);
/* Ausgabe: rechnung.pdf */
?>
Das ist kürzer und performanter als erst das komplette Array zu erzeugen und dann nur einen Wert zu lesen.
Sonderfälle beachten
Bei Dateien ohne Endung oder mit mehreren Punkten im Namen verhält sich pathinfo() folgendermaßen:
<?php
/* Datei ohne Endung */
$info = pathinfo('/etc/hosts');
echo $info['filename']; // hosts
echo isset($info['extension']) ? $info['extension'] : 'keine';
/* Ausgabe: keine */
/* Mehrere Punkte im Namen */
$info = pathinfo('archiv.2024.01.tar.gz');
echo $info['filename']; // archiv.2024.01.tar
echo $info['extension']; // gz
?>
Bei Dateien ohne Endung fehlt der Schlüssel extension im Array komplett. Deshalb sollte vor dem Zugriff mit isset() oder dem Null-Coalescing-Operator (??) geprüft werden. Bei mehreren Punkten wird nur der letzte Teil als Endung erkannt.
Praxisbeispiel: Upload-Dateityp prüfen
Ein häufiger Einsatz ist die Prüfung der Dateiendung bei Uploads:
<?php
$erlaubteEndungen = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
$dateiname = $_FILES['bild']['name'];
$endung = strtolower(
pathinfo($dateiname, PATHINFO_EXTENSION)
);
if (!in_array($endung, $erlaubteEndungen, true)) {
die('Dateityp nicht erlaubt.');
}
/* Sicheren Dateinamen generieren */
$neuerName = uniqid('img_') . '.' . $endung;
?>
Mit PATHINFO_EXTENSION wird die Endung extrahiert und gegen eine Whitelist geprüft. Durch strtolower() werden auch Endungen wie .JPG oder .Png korrekt erkannt.
OOP-Alternative: SplFileInfo
Für objektorientierte Projekte bietet SplFileInfo die gleichen Informationen über Methoden statt Array-Zugriffe:
<?php
$datei = new SplFileInfo('/var/www/html/bild.jpg');
echo $datei->getPath(); // /var/www/html
echo $datei->getFilename(); // bild.jpg
echo $datei->getExtension(); // jpg
echo $datei->getBasename('.jpg'); // bild
?>
SplFileInfo bietet darüber hinaus weitere Methoden wie getSize(), isReadable() und getMTime(), die bei der Arbeit mit dem Dateisystem nützlich sind.