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