Fnmatch: примеры (PHP)
Использование функции fnmatch в PHP для работы с шаблонами
Раздел: Работа с файловой системой
fnmatch(string $pattern, string $filename, int $flags = 0): boolФункция fnmatch в PHP
Функция fnmatch() в PHP проверяет, соответствует ли строка заданному шаблону с использованием подстановочных знаков, которые часто применяются в оболочке Unix. Она полезна для сравнения имен файлов, фильтрации строк по маске.
Функция доступна в PHP 4.3.0 и выше, но для Windows-платформ требуется версия PHP 5.3.0 или новее.
Аргументы функции
- pattern (string): Шаблон для сравнения, поддерживающий подстановочные знаки:
*(любое количество символов),?(один символ),[...](набор символов). - string (string): Проверяемая строка.
- flags (int): Опциональные флаги для изменения поведения:
FNM_PATHNAME(символ*не соответствует/),FNM_PERIOD(начальная точка в строке должна явно совпадать),FNM_CASEFOLD(регистронезависимое сравнение),FNM_NOESCAPE(отключение экранирования обратным слешем).
Примеры использования fnmatch
Простое сравнение
echo fnmatch('*.txt', 'document.txt') ? 'Да' : 'Нет';Да
С флагом FNM_CASEFOLD
echo fnmatch('*.TXT', 'file.txt', FNM_CASEFOLD) ? 'Да' : 'Нет';Да
С набором символов
echo fnmatch('image-[0-9].jpg', 'image-5.jpg') ? 'Да' : 'Нет';Да
С флагом FNM_PATHNAME
echo fnmatch('src/*.php', 'src/lib/file.php', FNM_PATHNAME) ? 'Да' : 'Нет';Нет
Похожие функции в PHP
- preg_match() – сравнение с регулярными выражениями, более гибкое, но сложнее в использовании. Предпочтительнее для сложных паттернов.
- glob() – поиск файлов по шаблону, возвращает массив совпадений. Удобна для работы с файловой системой.
- strfnmatch() (доступна через расширение) – аналог fnmatch, но с дополнительными возможностями. Редко используется.
Типичные ошибки
Использование без проверки доступности
if (fnmatch('*.txt', $file)) { // Ошибка, если функция недоступна
echo 'Совпало';
}Fatal error: Uncaught Error: Call to undefined function fnmatch()
Неправильные символы в шаблоне
echo fnmatch('file[.txt', 'file.txt') ? 'Да' : 'Нет'; // Незакрытая скобкаПредупреждение и неверный результат
Путаница с обратными слешами в Windows
echo fnmatch('C:\\*.txt', 'C:\\file.txt') ? 'Да' : 'Нет';Может работать некорректно
Изменения в PHP 8
В PHP 8 функция fnmatch() не претерпела значительных изменений. Однако, в целом, PHP 8 улучшил стабильность и производительность. Для Windows-платформ функция стабильно работает с PHP 5.3.0 и выше.
Расширенные примеры
Фильтрация массива файлов
Пример php
$files = ['a.jpg', 'b.png', 'c.txt'];
$images = array_filter($files, fn($f) => fnmatch('*.{jpg,png,gif}', $f));
print_r($images);Array ( [0] => a.jpg [1] => b.png )
Рекурсивный поиск с FNM_PATHNAME
Пример php
function findFiles($dir, $pattern) {
$result = [];
foreach (scandir($dir) as $file) {
if (fnmatch($pattern, $file, FNM_PATHNAME)) {
$result[] = $file;
}
}
return $result;
}
print_r(findFiles('.', '*.php'));Array ( [0] => index.php [1] => config.php )
Комбинация флагов
Пример php
echo fnmatch('*.TXT', 'file.txt', FNM_CASEFOLD | FNM_PERIOD) ? 'Да' : 'Нет';Да
Использование с экранированием
Пример php
echo fnmatch('file\*.txt', 'file*.txt', FNM_NOESCAPE) ? 'Да' : 'Нет';Нет (без FNM_NOESCAPE - Да)
Аналоги в других языках
Python: модуль fnmatch
import fnmatch
print(fnmatch.fnmatch('file.txt', '*.txt'))True
JavaScript: нет встроенной функции
// Используются регулярные выражения
console.log(/^.*\.txt$/.test('file.txt'));true
MySQL: оператор LIKE
SELECT 'file.txt' LIKE '%.txt';1
В отличие от PHP, MySQL использует % и _ вместо * и ?.
PHP fnmatch function comments
En
Fnmatch Match filename against a pattern