W3docs

glob()

Die glob()-Funktion ist eine eingebaute PHP-Funktion, die mithilfe eines Musters nach Dateien in einem Verzeichnis sucht und ein Array von Dateinamen oder Verzeichnissen zurückgibt.

Diese Seite behandelt die PHP-Funktion glob(): was sie tut, ihre Syntax und Flags, die shell-ähnlichen Platzhalter, die sie versteht, sowie praktische Muster wie das Abgleichen mehrerer Erweiterungen, das Auflisten nur von Verzeichnissen, das Sortieren von Ergebnissen und das rekursive Durchsuchen eines Verzeichnisbaums. Außerdem werden die Fallstricke erläutert, über die man stolpern kann — versteckte Dateien, der Unterschied zwischen „kein Treffer" und „Fehler" sowie der Fall, in dem ein anderes Werkzeug besser geeignet ist.

Was ist die glob()-Funktion?

Die Funktion glob() durchsucht ein Verzeichnis nach Pfadnamen, die einem Shell-Wildcard-Muster entsprechen, und gibt sie als Array zurück. Der Name stammt vom Unix-Shell-Globbing — demselben Mechanismus, den Ihr Terminal verwendet, wenn Sie ls *.txt eingeben.

Im Gegensatz zu einer regulären Ausdruckssuche gleicht glob() direkt gegen das Dateisystem ab und gibt daher nur Pfade zurück, die tatsächlich existieren. Es ist der schnellste Weg, Fragen zu beantworten wie „Gib mir alle .jpg-Dateien in diesem Ordner" oder „Welche Konfigurationsdateien beginnen mit db-".

Syntax

glob(string $pattern, int $flags = 0): array|false
ParameterBeschreibung
$patternDas Shell-Wildcard-Muster zum Abgleichen (z. B. images/*.png). Pfade können relativ zum Arbeitsverzeichnis des Skripts oder absolut sein.
$flagsOptionale Bitmaske aus GLOB_*-Konstanten, die das Verhalten anpassen. Standardmäßig 0.

Rückgabewert: ein Array mit übereinstimmenden Pfadnamen, ein leeres Array wenn nichts übereinstimmt, oder false bei einem nicht behebbaren Fehler (zum Beispiel ein nicht lesbares Verzeichnis). Da sowohl ein leeres Ergebnis als auch ein Fehler „falsy" sind, prüfen Sie mit === false, wenn Sie Fehler gezielt erkennen müssen.

Die Platzhalter, die glob() versteht

glob() erkennt shell-ähnliche Muster, keine regulären Ausdrücke:

MusterTrifft zu auf
*beliebig viele Zeichen (aber kein /, bleibt also auf einer Verzeichnisebene)
?genau ein Zeichen
[abc]ein Zeichen aus der Menge — hier a, b oder c
[a-z]ein Zeichen aus einem Bereich
[!a-z]ein Zeichen außerhalb des Bereichs
{a,b}a oder b — nur wenn das Flag GLOB_BRACE gesetzt ist

Ein erstes Beispiel

<?php

$files = glob('*.txt');

if ($files === false) {
    echo 'glob() failed to read the directory.' . PHP_EOL;
} else {
    foreach ($files as $file) {
        echo $file . PHP_EOL;
    }
}

Dies sucht nach allen Dateien mit der Endung .txt im aktuellen Arbeitsverzeichnis und gibt jeden Namen in einer eigenen Zeile aus. Beachten Sie die Prüfung === false: Sie unterscheidet einen echten Fehler vom völlig gültigen Fall „keine .txt-Dateien hier", der einfach ein leeres Array liefert, über das die foreach-Schleife hinweggeht.

Die glob()-Flags

Das zweite Argument kombiniert eine oder mehrere Konstanten mit dem bitweisen ODER-Operator (|):

FlagWirkung
GLOB_MARKHängt ein / an jeden zurückgegebenen Verzeichnisnamen an
GLOB_NOSORTGibt Treffer in der Reihenfolge zurück, die das Dateisystem liefert, und überspringt die standardmäßige alphabetische Sortierung (schneller)
GLOB_NOCHECKFalls nichts übereinstimmt, wird das Muster selbst statt eines leeren Arrays zurückgegeben
GLOB_NOESCAPEBehandelt Backslashes wörtlich und nicht als Escape-Zeichen
GLOB_BRACEErweitert {a,b,c}, sodass das Muster a, b oder c trifft
GLOB_ONLYDIRGibt nur Einträge zurück, die Verzeichnisse sind
GLOB_ERRBricht ab und gibt false bei Lesefehlern zurück, anstatt sie zu überspringen

Mehrere Erweiterungen mit GLOB_BRACE abgleichen

<?php

$images = glob('uploads/*.{jpg,jpeg,png,gif}', GLOB_BRACE);

foreach ($images as $image) {
    echo $image . PHP_EOL;
}

GLOB_BRACE ermöglicht es, mit einem einzigen Aufruf vier Erweiterungen abzudecken — das ist wesentlich übersichtlicher als glob() viermal auszuführen und die Ergebnisse zu zusammenzuführen.

Nur Unterverzeichnisse auflisten

<?php

$dirs = glob('storage/*', GLOB_ONLYDIR);

foreach ($dirs as $dir) {
    echo $dir . PHP_EOL;
}

Mit GLOB_ONLYDIR werden einfache Dateien innerhalb von storage/ herausgefiltert, sodass nur die Verzeichnisse übrig bleiben — praktisch beim Iterieren über benutzerbezogene Ordner, Cache-Buckets und Ähnliches.

Ergebnisse sortieren

Standardmäßig gibt glob() Treffer in aufsteigender alphabetischer Reihenfolge zurück. Wenn Sie eine andere Reihenfolge benötigen — etwa die neueste Datei zuerst — sortieren Sie das Array selbst:

<?php

$files = glob('logs/*.log');

usort($files, static fn ($a, $b) => filemtime($b) <=> filemtime($a));

print_r($files);

Hier ordnet usort() die Liste nach Änderungszeit (filemtime()) neu, neueste zuerst. Übergeben Sie GLOB_NOSORT an glob(), wenn Sie ohnehin neu sortieren werden — das vermeidet die überflüssige initiale Sortierung bei großen Verzeichnissen.

Rekursive Suche

glob() selbst steigt nicht in Unterverzeichnisse hinab — * überschreitet nie ein /. Um einen gesamten Verzeichnisbaum zu durchlaufen, kombinieren Sie glob() mit GLOB_ONLYDIR und Rekursion:

<?php

function findFiles(string $dir, string $pattern): array
{
    $files = glob($dir . '/' . $pattern);

    foreach (glob($dir . '/*', GLOB_ONLYDIR) as $subDir) {
        $files = array_merge($files, findFiles($subDir, $pattern));
    }

    return $files;
}

print_r(findFiles('src', '*.php'));

Für tiefe oder sehr große Verzeichnisbäume ist PHP's RecursiveDirectoryIterator in der Regel besser geeignet, aber dieses Muster reicht für die meisten alltäglichen Aufgaben aus.

Häufige Fallstricke

  • Versteckte Dateien werden übersprungen. Ein führendes * trifft keine Punkt-Dateien, daher gibt glob('*') weder .env noch .gitignore zurück. Gleichen Sie sie explizit mit einem Muster wie glob('.*') ab.
  • Leeres Array vs. false. Eine foreach-Schleife über ein leeres Array ist harmlos, aber count(), array_map() und ähnliche Funktionen geben Warnungen aus, wenn glob() false zurückgegeben hat. Prüfen Sie daher zuerst mit === false.
  • Kein Regex. glob() versteht nur Shell-Platzhalter. Für den Abgleich mit regulären Ausdrücken auf einer vorhandenen Liste von Namen verwenden Sie preg_grep() oder testen Sie einzelne Namen mit fnmatch().
  • Plattformübergreifende Pfade. Verwenden Sie Schrägstriche (/) in Mustern auch unter Windows, oder erstellen Sie Pfade mit DIRECTORY_SEPARATOR, damit derselbe Code überall funktioniert.

Wann glob() vs. andere Werkzeuge verwenden

  • Verwenden Sie glob(), wenn Sie eine schnelle, sortierte Liste von Pfaden benötigen, die einem einfachen Platzhalter in einem Verzeichnis entsprechen.
  • Verwenden Sie scandir(), wenn Sie jeden Eintrag eines Verzeichnisses (einschließlich Punkt-Dateien) möchten und selbst filtern.
  • Verwenden Sie opendir() / readdir() für speicherschonendes Streaming sehr großer Verzeichnisse.
  • Verwenden Sie fnmatch(), um einen einzelnen Namen gegen ein Shell-Muster zu testen, ohne das Dateisystem zu berühren.

Wenn Sie eine Liste von Pfaden haben, helfen Ihnen pathinfo(), is_file() und file_exists() dabei, jeden Eintrag zu untersuchen. Den größeren Zusammenhang finden Sie in der PHP Filesystem-Übersicht.

Fazit

glob() ist der ergonomischste Weg, um in PHP Dateien nach einem Muster zu finden: Übergeben Sie einen shell-ähnlichen Platzhalter und erhalten Sie ein sortiertes Array echter Pfade zurück. Vergessen Sie nicht, bei kritischen Fehlern auf false zu prüfen, greifen Sie auf GLOB_BRACE und GLOB_ONLYDIR zurück, um Muster übersichtlich zu halten, und wechseln Sie zu einem rekursiven Iterator, wenn Sie einen gesamten Verzeichnisbaum durchsuchen müssen.

Übungen

Übung
Was ist die Funktion von glob() in PHP?
Was ist die Funktion von glob() in PHP?
Was this page helpful?