Glob: примеры (PHP)

Руководство по работе с функцией glob для поиска файлов в PHP
Раздел: Работа с файловой системой
glob(string $pattern, int $flags = 0): array|false
Функция glob в PHP

Функция glob() используется для поиска файловых путей, совпадающих с заданным шаблоном. Она часто применяется для получения списка файлов в директории, соответствующих определенной маске, например, всех изображений или текстовых файлов.

Аргументы функции

Функция принимает два аргумента:

  1. $pattern (обязательный): Строка, содержащая шаблон поиска. Поддерживает специальные символы:
    • * — соответствует любому количеству любых символов.
    • ? — соответствует ровно одному любому символу.
    • [...] — соответствует одному символу из перечисленных в скобках (например, [a-z]).
  2. $flags (опциональный): Битовая маска, изменяющая поведение функции.
    • GLOB_MARK — добавляет косую черту (слэш) к каждому возвращаемому каталогу.
    • GLOB_NOSORT — возвращает файлы в том порядке, в каком они встречаются в директории (без сортировки).
    • GLOB_NOCHECK — возвращает сам шаблон поиска, если не найдено ни одного совпадения.
    • GLOB_NOESCAPE — обратные слеши не экранируют метасимволы.
    • GLOB_BRACE — расширяет {a,b,c} для соответствия нескольким шаблонам.
    • GLOB_ONLYDIR — возвращает только те результаты, которые являются директориями.
    • GLOB_ERR — остановка при ошибках чтения (например, отсутствии прав).

Функция возвращает массив найденных путей или false в случае ошибки.

Простые примеры использования
Поиск всех PHP файлов
$files = glob('*.php');
print_r($files);
Array
(
    [0] => index.php
    [1] => config.php
    [2] => functions.php
)
Использование флага GLOB_ONLYDIR
$dirs = glob('*', GLOB_ONLYDIR);
print_r($dirs);
Array
(
    [0] => images
    [1] => css
    [2] => uploads
)
Шаблон с несколькими вариантами через GLOB_BRACE
$images = glob('*.{jpg,png,gif}', GLOB_BRACE);
print_r($images);
Array
(
    [0] => logo.jpg
    [1] => banner.png
    [2] => icon.gif
)
Похожие функции в PHP
  • scandir() — возвращает массив файлов и директорий по указанному пути. Более простая, но не поддерживает шаблоны поиска. Используется, когда нужен простой список всего содержимого директории.
  • opendir(), readdir(), closedir() — функции для пошагового чтения содержимого директории. Требуют больше кода, но предоставляют низкоуровневый контроль, полезны для обработки очень больших директорий.
  • DirectoryIterator (класс) — объектно-ориентированный подход для итерации по файловой системе. Удобен для комплексной работы с атрибутами файлов (размер, права доступа).
  • SplFileInfo (класс) — предоставляет высокоуровневый интерфейс для информации о файле. Используется совместно с итераторами.

Функция glob() предпочтительна, когда необходим поиск по шаблону с использованием масок, и требуется быстрый результат в виде массива.

Типичные ошибки
Невнимательность к возвращаемому значению
$files = glob('/несуществующий/путь/*');
foreach ($files as $file) { // Ошибка, если $files === false
    echo $file;
}
Warning: Invalid argument supplied for foreach()

Проверка на false обязательна.

Ожидание рекурсивного поиска
// glob() НЕ ищет рекурсивно по умолчанию
$files = glob('*.txt'); // Найдет только в текущей директории

Для рекурсивного поиска нужно явно указывать путь или использовать другие методы, например, RecursiveDirectoryIterator.

Путаница с точкой в шаблоне
$files = glob('*config.php'); // Найдет 'myconfig.php', но не 'config.php'
$files = glob('config.php');   // Найдет именно 'config.php'
Изменения в последних версиях PHP
  • В PHP 8.0 параметр $flags теперь является опциональным и может быть указан как 0. Это изменение согласуется со строгими стандартами типизации языка. Ранее требовалось явное указание, даже если флаги не использовались.
  • Начиная с PHP 7.1, для флага GLOB_BRACE на Windows доступна эмуляция, что улучшило кроссплатформенность кода, использующего этот флаг.
Расширенные примеры
Комбинация флагов
Пример php
// Поиск только директорий, без сортировки, с добавлением слэша
$result = glob('/var/www/projects/*', GLOB_ONLYDIR | GLOB_NOSORT | GLOB_MARK);
print_r($result);
Array
(
    [0] => api/
    [2] => admin_panel/
    [1] => frontend/
)
Фильтрация файлов по дате изменения
Пример php
$recentLogs = [];
$weekAgo = time() - (7 * 24 * 60 * 60);
$files = glob('/logs/*.log');
if ($files !== false) {
    foreach ($files as $file) {
        if (filemtime($file) > $weekAgo) {
            $recentLogs[] = $file;
        }
    }
}
print_r($recentLogs);
Поиск с использованием маски символов
Пример php
// Найти файлы с именами file1.txt, file2.txt, file3.txt, но не file10.txt
$files = glob('file[1-3].txt');
print_r($files);
Array
(
    [0] => file1.txt
    [1] => file2.txt
    [2] => file3.txt
)
Имитация рекурсивного поиска с уровнем вложенности
Пример php
// Поиск всех .ini файлов в текущей директории и в одной поддиректории
$files = array_merge(glob('*.ini'), glob('*/*.ini'));
print_r($files);
Аналоги в других языках
Python: модуль glob
import glob
files = glob.glob('*.py')
print(files)
['script.py', 'utils.py', 'test.py']

Модуль предоставляет похожий функционал. Есть метод iglob() для ленивой итерации. Поддерживает рекурсивный поиск с аргументом recursive=True и шаблоном **.

JavaScript (Node.js): модуль fs и glob
// С использованием пакета 'glob' (npm install glob)
const { glob } = require('glob');
(async () => {
  const files = await glob('*.js');
  console.log(files);
})();
['app.js', 'index.js', 'lib.js']

Встроенные методы Node.js (fs.readdir) не поддерживают шаблоны, поэтому часто используют сторонний пакет glob.

MySQL: оператор LIKE
SELECT * FROM files WHERE name LIKE '%.log%';

Работает только со строковыми данными в таблицах, а не с реальной файловой системой. Символы подстановки: % (любое количество символов) и _ (один символ).

PHP glob function comments

En
Glob Find pathnames matching a pattern