Wer mit Dateipfaden arbeitet, braucht oft nur den Dateinamen ohne das gesamte Verzeichnis. PHP stellt dafür die Funktion basename() bereit, die den letzten Bestandteil eines Pfades zurückgibt.
Grundlegende Verwendung
Die Funktion basename() erwartet einen Pfad als String und gibt den Dateinamen zurück:
<?php
$pfad = '/var/www/html/bilder/foto.jpg';
echo basename($pfad);
/* Ausgabe: foto.jpg */
?>
Egal ob der Pfad mit Slash (/) oder Backslash (\) getrennt ist, basename() erkennt beides. Auf Windows-Systemen funktionieren beide Trennzeichen, auf Linux nur der Slash.
Dateiendung entfernen mit dem Suffix-Parameter
Der optionale zweite Parameter entfernt eine angegebene Endung vom Ergebnis. Das ist praktisch, wenn nur der Dateiname ohne Extension gebraucht wird:
<?php
$pfad = '/uploads/dokument.pdf';
echo basename($pfad, '.pdf');
/* Ausgabe: dokument */
echo basename($pfad, '.txt');
/* Ausgabe: dokument.pdf (Suffix stimmt nicht, bleibt unveraendert) */
?>
Wenn das angegebene Suffix nicht zum Dateinamen passt, wird der vollständige Name zurückgegeben.
Praxisbeispiel: Datei-Upload absichern
Bei Datei-Uploads senden manche Browser den kompletten Pfad statt nur den Dateinamen. Mit basename() lässt sich der reine Dateiname extrahieren:
<?php
$upload_name = $_FILES['datei']['name'];
/* Nur den Dateinamen verwenden,
eventuelle Pfadangaben entfernen */
$sicherer_name = basename($upload_name);
$ziel = '/var/www/uploads/' . $sicherer_name;
move_uploaded_file($_FILES['datei']['tmp_name'], $ziel);
?>
So wird verhindert, dass ein manipulierter Pfad wie ../../etc/passwd als Dateiname durchrutscht.
Mehr Kontrolle mit pathinfo()
Wenn mehrere Bestandteile eines Pfades gleichzeitig gebraucht werden, ist pathinfo() die bessere Wahl. Die Funktion gibt ein Array mit allen Teilen 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
?>
Mit pathinfo() lassen sich Verzeichnis, Dateiname, Endung und Name ohne Endung in einem Aufruf ermitteln. Das spart Code, wenn mehrere dieser Informationen benötigt werden.
Übersicht: basename() vs. pathinfo()
Beide Funktionen haben ihre Berechtigung. basename() ist ideal, wenn nur der Dateiname gebraucht wird. pathinfo() eignet sich besser, wenn zusätzlich das Verzeichnis oder die Dateiendung benötigt werden. Für das Verzeichnis allein gibt es außerdem dirname(), die das Gegenstück zu basename() bildet.