Glob: примеры (PHP)
glob(string $pattern, int $flags = 0): array|falseФункция glob() используется для поиска файловых путей, совпадающих с заданным шаблоном. Она часто применяется для получения списка файлов в директории, соответствующих определенной маске, например, всех изображений или текстовых файлов.
Функция принимает два аргумента:
- $pattern (обязательный): Строка, содержащая шаблон поиска. Поддерживает специальные символы:
- * — соответствует любому количеству любых символов.
- ? — соответствует ровно одному любому символу.
- [...] — соответствует одному символу из перечисленных в скобках (например, [a-z]).
- $flags (опциональный): Битовая маска, изменяющая поведение функции.
- GLOB_MARK — добавляет косую черту (слэш) к каждому возвращаемому каталогу.
- GLOB_NOSORT — возвращает файлы в том порядке, в каком они встречаются в директории (без сортировки).
- GLOB_NOCHECK — возвращает сам шаблон поиска, если не найдено ни одного совпадения.
- GLOB_NOESCAPE — обратные слеши не экранируют метасимволы.
- GLOB_BRACE — расширяет {a,b,c} для соответствия нескольким шаблонам.
- GLOB_ONLYDIR — возвращает только те результаты, которые являются директориями.
- GLOB_ERR — остановка при ошибках чтения (например, отсутствии прав).
Функция возвращает массив найденных путей или false в случае ошибки.
$files = glob('*.php');
print_r($files);Array
(
[0] => index.php
[1] => config.php
[2] => functions.php
)$dirs = glob('*', GLOB_ONLYDIR);
print_r($dirs);Array
(
[0] => images
[1] => css
[2] => uploads
)$images = glob('*.{jpg,png,gif}', GLOB_BRACE);
print_r($images);Array
(
[0] => logo.jpg
[1] => banner.png
[2] => icon.gif
)- 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 8.0 параметр $flags теперь является опциональным и может быть указан как 0. Это изменение согласуется со строгими стандартами типизации языка. Ранее требовалось явное указание, даже если флаги не использовались.
- Начиная с PHP 7.1, для флага GLOB_BRACE на Windows доступна эмуляция, что улучшило кроссплатформенность кода, использующего этот флаг.
// Поиск только директорий, без сортировки, с добавлением слэша
$result = glob('/var/www/projects/*', GLOB_ONLYDIR | GLOB_NOSORT | GLOB_MARK);
print_r($result);Array
(
[0] => api/
[2] => admin_panel/
[1] => frontend/
)$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);// Найти файлы с именами 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
)// Поиск всех .ini файлов в текущей директории и в одной поддиректории
$files = array_merge(glob('*.ini'), glob('*/*.ini'));
print_r($files);import glob
files = glob.glob('*.py')
print(files)['script.py', 'utils.py', 'test.py']
Модуль предоставляет похожий функционал. Есть метод iglob() для ленивой итерации. Поддерживает рекурсивный поиск с аргументом recursive=True и шаблоном **.
// С использованием пакета '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.
SELECT * FROM files WHERE name LIKE '%.log%';Работает только со строковыми данными в таблицах, а не с реальной файловой системой. Символы подстановки: % (любое количество символов) и _ (один символ).