Die PHP-Funktion glob() durchsucht ein Verzeichnis nach Dateien, deren Namen einem bestimmten Muster entsprechen. Anders als scandir() liefert sie direkt die vollständigen Pfade zurück und ermöglicht den Einsatz von Wildcards wie Sternchen, Fragezeichen und eckigen Klammern. Ob das Auflisten aller PHP-Dateien in einem Projektordner, das gezielte Filtern nach Dateiendungen oder das rekursive Durchsuchen verschachtelter Verzeichnisse: glob() bietet eine kompakte und leistungsfähige Lösung für diese Aufgaben. In diesem Tutorial werden die Syntax, alle verfügbaren Wildcards und Flags sowie praktische Anwendungsbeispiele Schritt für Schritt vorgestellt.

Bevor die Wildcards und Flags im Detail behandelt werden, lohnt sich ein Blick auf die grundlegende Arbeitsweise der Funktion.
Was macht glob()?
Die Funktion glob() nimmt ein Suchmuster (Pattern) entgegen und gibt ein Array mit allen passenden Dateinamen und Pfaden zurück. Bei keinem Treffer ist das Ergebnis ein leeres Array. Im Fehlerfall gibt die Funktion false zurück.
<?php
/* Grundlegende Syntax */
$dateien = glob(string $pattern, int $flags = 0);
/* Alle PHP-Dateien im aktuellen Verzeichnis suchen */
$php_dateien = glob("*.php");
print_r($php_dateien);
/*
Array
(
[0] => index.php
[1] => config.php
[2] => functions.php
)
*/
Ein wichtiger Punkt: glob() findet standardmäßig keine versteckten Dateien, also solche, deren Name mit einem Punkt beginnt. Außerdem liefert die Funktion die vollständigen Pfade relativ zum angegebenen Muster, was die Weiterverarbeitung mit Funktionen wie file_get_contents() oder unlink() erleichtert.
Wildcards und Muster
Die Stärke von glob() liegt in der Mustererkennung. Drei Arten von Wildcards stehen zur Verfügung, die sich beliebig kombinieren lassen.
Sternchen (*) für beliebige Zeichen
Das Sternchen steht für eine beliebige Anzahl von Zeichen, einschließlich null Zeichen. Es ist die am häufigsten verwendete Wildcard.
<?php
/* Alle Dateien mit der Endung .log */
$logs = glob("/var/log/*.log");
/* Alle Dateien, die mit "backup" beginnen */
$backups = glob("/daten/backup*");
/* Alle Dateien in einem Unterverzeichnis */
$bilder = glob("uploads/bilder/*");
Fragezeichen (?) für ein einzelnes Zeichen
Das Fragezeichen steht für genau ein beliebiges Zeichen. Es eignet sich besonders gut, wenn die Länge des Dateinamens bekannt ist, aber einzelne Stellen variieren.
<?php
/* Dateien wie bild1.png, bild2.png, bildA.png */
$bilder = glob("bild?.png");
/* Dateien mit zweistelliger Nummer: log01.txt bis log99.txt */
$logs = glob("log??.txt");
Eckige Klammern [] für Zeichenbereiche
Mit eckigen Klammern lässt sich ein Bereich oder eine Menge erlaubter Zeichen an einer bestimmten Stelle definieren. Das ermöglicht eine präzisere Filterung als das Fragezeichen.
<?php
/* Nur Dateien mit Ziffern: datei0.txt bis datei9.txt */
$dateien = glob("datei[0-9].txt");
/* Nur Kleinbuchstaben a bis f */
$hex = glob("block_[a-f].dat");
/* Bestimmte Zeichen: nur a, b oder c */
$auswahl = glob("teil_[abc].csv");
Das folgende Diagramm zeigt, wie glob() ein Muster verarbeitet und das Ergebnis liefert.
flowchart TD
A["glob() mit Pattern aufrufen"] --> B["Wildcards im Pattern auswerten"]
B --> C["Verzeichnis durchsuchen"]
C --> D{"Treffer gefunden?"}
D -- "Ja" --> E["Array mit vollständigen Pfaden"]
D -- "Nein" --> F["Leeres Array"]
E --> G["Optionale Sortierung anwenden"]
G --> H["Ergebnis-Array zurückgeben"]
F --> H
Die wichtigsten Flags
Der zweite Parameter von glob() nimmt Flags entgegen, die das Verhalten der Funktion steuern. Mehrere Flags lassen sich mit dem Oder-Operator kombinieren.
GLOB_BRACE für mehrere Muster
Mit GLOB_BRACE können mehrere Muster in geschweiften Klammern zusammengefasst werden. Das erspart mehrfache Aufrufe von glob().
<?php
/* Mehrere Dateiendungen gleichzeitig suchen */
$medien = glob("uploads/*.{jpg,png,gif,webp}", GLOB_BRACE);
foreach ($medien as $datei) {
echo $datei . "\n";
}
GLOB_ONLYDIR für nur Verzeichnisse
Das Flag GLOB_ONLYDIR beschränkt die Ergebnisse auf Verzeichnisse. Dateien werden dabei ignoriert.
<?php
/* Nur Unterverzeichnisse auflisten */
$ordner = glob("projekte/*", GLOB_ONLYDIR);
print_r($ordner);
/*
Array
(
[0] => projekte/webshop
[1] => projekte/blog
[2] => projekte/api
)
*/
GLOB_NOSORT für Performance
Standardmäßig sortiert glob() die Ergebnisse alphabetisch. Mit GLOB_NOSORT entfällt dieser Schritt, was bei Verzeichnissen mit vielen Dateien spürbar schneller sein kann.
<?php
/* Ohne Sortierung für bessere Performance */
$alle = glob("/var/data/*.csv", GLOB_NOSORT);
/* Flags kombinieren */
$ergebnis = glob("assets/*.{css,js}", GLOB_BRACE | GLOB_NOSORT);
Praktische Beispiele
Die folgenden Codebeispiele zeigen typische Einsatzszenarien, die in realen Projekten häufig vorkommen.
<?php
/* Alle Cache-Dateien löschen */
$cache_dateien = glob("cache/*.tmp");
foreach ($cache_dateien as $datei) {
unlink($datei);
}
echo count($cache_dateien) . " Cache-Dateien gelöscht.";
/* Neueste Log-Datei ermitteln */
$logs = glob("logs/*.log");
$neueste = "";
$max_zeit = 0;
foreach ($logs as $log) {
$zeit = filemtime($log);
if ($zeit > $max_zeit) {
$max_zeit = $zeit;
$neueste = $log;
}
}
echo "Neueste Log-Datei: " . $neueste;
glob() rekursiv einsetzen
Die Funktion glob() durchsucht standardmäßig nur eine einzelne Verzeichnisebene. Für eine rekursive Suche über mehrere Ebenen hinweg lässt sich eine eigene Funktion schreiben, die glob() wiederholt aufruft.
<?php
function glob_rekursiv($pattern, $flags = 0) {
$dateien = glob($pattern, $flags);
/* Alle Unterverzeichnisse durchsuchen */
$verzeichnisse = glob(
dirname($pattern) . "/*",
GLOB_ONLYDIR | GLOB_NOSORT
);
foreach ($verzeichnisse as $verzeichnis) {
$unterergebnis = glob_rekursiv(
$verzeichnis . "/" . basename($pattern),
$flags
);
$dateien = array_merge($dateien, $unterergebnis);
}
return $dateien;
}
/* Alle PHP-Dateien im Projektbaum finden */
$alle_php = glob_rekursiv("src/*.php");
echo "Gefunden: " . count($alle_php) . " PHP-Dateien\n";
foreach ($alle_php as $datei) {
echo $datei . "\n";
}
Diese rekursive Variante nutzt GLOB_ONLYDIR, um zunächst alle Unterverzeichnisse zu ermitteln, und wendet das ursprüngliche Muster dann auf jede Ebene an. Für sehr tiefe Verzeichnisstrukturen kann alternativ RecursiveDirectoryIterator aus der SPL verwendet werden.
glob() vs. scandir()
Beide Funktionen listen Dateien in einem Verzeichnis auf, unterscheiden sich aber in wesentlichen Punkten. Die Funktion glob() gibt vollständige Pfade zurück und unterstützt Wildcards direkt. Die Funktion scandir() liefert nur Dateinamen ohne Pfad und gibt immer alle Einträge zurück, einschließlich der Punktverzeichnisse . und ...
<?php
/* glob() liefert gefilterte, vollständige Pfade */
$ergebnis_glob = glob("bilder/*.jpg");
/* ["bilder/foto1.jpg", "bilder/foto2.jpg"] */
/* scandir() liefert alle Einträge ohne Pfad */
$ergebnis_scan = scandir("bilder");
/* [".", "..", "foto1.jpg", "foto2.jpg", "thumbs"] */
Die Wahl zwischen beiden Funktionen hängt vom Anwendungsfall ab. Wenn nur Dateien eines bestimmten Typs benötigt werden, ist glob() die bessere Wahl, da sie das Filtern bereits übernimmt. Wenn hingegen alle Einträge eines Verzeichnisses inklusive Unterordner benötigt werden, bietet scandir() den direkteren Weg.
Fazit
Die Funktion glob() ist ein vielseitiges Werkzeug zum Suchen und Auflisten von Dateien in PHP. Mit Wildcards wie dem Sternchen, dem Fragezeichen und eckigen Klammern lassen sich Suchmuster präzise formulieren. Die Flags GLOB_BRACE, GLOB_ONLYDIR und GLOB_NOSORT erweitern die Möglichkeiten zusätzlich. Im Vergleich zu scandir() bietet glob() den Vorteil der integrierten Mustersuche und der vollständigen Pfadangaben im Ergebnis. Für rekursive Suchen lässt sich die Funktion mit wenigen Zeilen Code in eine eigene Hilfsfunktion einbetten, die beliebig tiefe Verzeichnisstrukturen durchläuft.