glob()
La fonction glob() en PHP recherche des fichiers dans un répertoire selon un motif, retournant un tableau de noms de fichiers ou de répertoires.
Cette page couvre la fonction PHP glob() : ce qu'elle fait, sa syntaxe et ses indicateurs, les caractères génériques de style shell qu'elle reconnaît, ainsi que des modèles pratiques tels que la correspondance de plusieurs extensions, la liste des seuls répertoires, le tri des résultats et le parcours récursif d'une arborescence. Elle explique également les pièges courants — les fichiers cachés, la différence entre « aucune correspondance » et « erreur », et quand utiliser un autre outil.
Qu'est-ce que la fonction glob() ?
La fonction glob() recherche dans un répertoire les noms de chemins correspondant à un motif générique de style shell et les retourne sous forme de tableau. Le nom vient du globbing des shells Unix — le même mécanisme que votre terminal utilise lorsque vous tapez ls *.txt.
Contrairement à une recherche par expression régulière, glob() effectue sa correspondance directement sur le système de fichiers, de sorte qu'elle ne retourne que des chemins qui existent réellement. C'est le moyen le plus rapide de répondre à des questions comme « donne-moi tous les .jpg de ce dossier » ou « quels fichiers de configuration commencent par db- ».
Syntaxe
glob(string $pattern, int $flags = 0): array|false| Paramètre | Description |
|---|---|
$pattern | Le motif générique de style shell à faire correspondre (ex. images/*.png). Les chemins peuvent être relatifs au répertoire de travail du script ou absolus. |
$flags | Masque de bits optionnel de constantes GLOB_* qui modifient le comportement. Par défaut à 0. |
Valeur de retour : un tableau des noms de chemins correspondants, un tableau vide si rien ne correspond, ou false en cas d'erreur irrécupérable (par exemple, un répertoire illisible). Puisque les deux résultats vides et une erreur sont « faux », vérifiez avec === false lorsque vous devez spécifiquement détecter des erreurs.
Les caractères génériques reconnus par glob()
glob() reconnaît les motifs de style shell, pas les expressions régulières :
| Motif | Correspondances |
|---|---|
* | n'importe quel nombre de caractères (mais pas un /, donc il reste dans un seul niveau de répertoire) |
? | exactement un caractère |
[abc] | un caractère de l'ensemble — ici a, b ou c |
[a-z] | un caractère d'une plage |
[!a-z] | un caractère absent de la plage |
{a,b} | a ou b — seulement lorsque l'indicateur GLOB_BRACE est défini |
Un premier exemple
<?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;
}
}Ce code recherche tous les fichiers se terminant par .txt dans le répertoire de travail actuel et affiche chaque nom sur sa propre ligne. Notez la vérification === false : elle distingue un vrai échec du cas parfaitement valide « aucun fichier .txt ici », qui retourne simplement un tableau vide que le foreach ignore.
Les indicateurs de glob()
Le deuxième argument combine une ou plusieurs constantes avec l'opérateur OR bit à bit (|) :
| Indicateur | Effet |
|---|---|
GLOB_MARK | Ajoute un / à la fin de chaque nom de répertoire retourné |
GLOB_NOSORT | Retourne les correspondances dans l'ordre fourni par le système de fichiers, en omettant le tri alphabétique par défaut (plus rapide) |
GLOB_NOCHECK | Si rien ne correspond, retourne le motif lui-même plutôt qu'un tableau vide |
GLOB_NOESCAPE | Traite les barres obliques inverses littéralement plutôt que comme des caractères d'échappement |
GLOB_BRACE | Développe {a,b,c} pour que le motif corresponde à a, b ou c |
GLOB_ONLYDIR | Retourne uniquement les entrées qui sont des répertoires |
GLOB_ERR | S'arrête et retourne false sur les erreurs de lecture plutôt que de les ignorer |
Correspondance de plusieurs extensions avec GLOB_BRACE
<?php
$images = glob('uploads/*.{jpg,jpeg,png,gif}', GLOB_BRACE);
foreach ($images as $image) {
echo $image . PHP_EOL;
}GLOB_BRACE permet à un seul appel de couvrir quatre extensions, ce qui est bien plus propre qu'appeler glob() quatre fois et fusionner les résultats.
Lister uniquement les sous-répertoires
<?php
$dirs = glob('storage/*', GLOB_ONLYDIR);
foreach ($dirs as $dir) {
echo $dir . PHP_EOL;
}Avec GLOB_ONLYDIR, les fichiers ordinaires dans storage/ sont filtrés, vous n'obtenez donc que les répertoires — pratique pour itérer sur des dossiers par utilisateur, des compartiments de cache, etc.
Trier les résultats
Par défaut, glob() retourne les correspondances dans l'ordre alphabétique croissant. Si vous avez besoin d'un ordre différent — par exemple le fichier le plus récent en premier — triez le tableau vous-même :
<?php
$files = glob('logs/*.log');
usort($files, static fn ($a, $b) => filemtime($b) <=> filemtime($a));
print_r($files);Ici usort() réordonne la liste par date de modification (filemtime()), le plus récent en premier. Passez GLOB_NOSORT à glob() lorsque vous allez retrier de toute façon — cela évite le tri initial redondant sur les grands répertoires.
Recherche récursive
glob() lui-même ne descend pas dans les sous-répertoires — * ne franchit jamais un /. Pour parcourir une arborescence entière, combinez glob() avec GLOB_ONLYDIR et la récursion :
<?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'));Pour les arborescences profondes ou très volumineuses, le RecursiveDirectoryIterator de PHP convient généralement mieux, mais ce modèle suffit pour la plupart des tâches courantes.
Pièges courants
- Les fichiers cachés sont ignorés. Un
*en début de motif ne correspond pas aux fichiers pointés, doncglob('*')ne retournera pas.envni.gitignore. Faites-les correspondre explicitement avec un motif commeglob('.*'). - Tableau vide vs.
false. Unforeachsur un tableau vide est sans danger, maiscount(),array_map()et leurs semblables afficheront un avertissement siglob()a retournéfalse. Vérifiez d'abord avec=== false. - Pas de regex.
glob()comprend uniquement les caractères génériques de style shell. Pour une correspondance par expression régulière sur une liste existante de noms, utilisezpreg_grep()ou testez des noms individuels avecfnmatch(). - Chemins multiplateformes. Utilisez des barres obliques (
/) dans les motifs même sur Windows, ou construisez les chemins avecDIRECTORY_SEPARATOR, afin que le même code fonctionne partout.
Quand utiliser glob() plutôt qu'un autre outil
- Utilisez
glob()lorsque vous souhaitez une liste rapide et triée de chemins correspondant à un simple caractère générique dans un répertoire. - Utilisez
scandir()lorsque vous voulez toutes les entrées d'un répertoire (y compris les fichiers cachés) et que vous avez l'intention de les filtrer vous-même. - Utilisez
opendir()/readdir()pour un streaming économe en mémoire des grands répertoires. - Utilisez
fnmatch()pour tester un seul nom contre un motif shell sans accéder au système de fichiers.
Une fois que vous avez une liste de chemins, pathinfo(), is_file() et file_exists() vous aident à inspecter chacun d'eux. Consultez l'aperçu du système de fichiers PHP pour une vue d'ensemble.
Conclusion
glob() est la façon la plus ergonomique de trouver des fichiers par motif en PHP : passez un caractère générique de style shell, récupérez un tableau trié de chemins réels. N'oubliez pas de vérifier false lorsque les erreurs sont importantes, utilisez GLOB_BRACE et GLOB_ONLYDIR pour garder les motifs propres, et passez à un itérateur récursif lorsque vous devez chercher dans une arborescence entière.