Как получить расширение файла в PHP: лучшие практики 2025 года
Вы когда-нибудь сталкивались с ситуацией, когда нужно быстро определить, какой файл загружает пользователь — изображение, документ или архив? Или, может быть, вы пишете парсер файлов и вам нужно динамически обработать сотни расширений? Вопрос "How can I get a file's extension in PHP?" уже много лет входит в топ самых популярных на Stack Overflow, набирая сотни тысяч просмотров. И это не случайно.
Казалось бы, что может быть проще? Взял строку, нашёл точку, отрезал хвост. Но PHP — язык с характером. Он предлагает сразу несколько встроенных функций, и выбор правильной зависит от контекста. В 2025 году, когда безопасность и производительность важны как никогда, мы разберём все актуальные способы и выявим лучший.
В этой статье вы узнаете:
- Пять рабочих способов получить расширение файла в PHP.
- Какой метод стоит использовать в 95% случаев.
- Как не попасть в ловушку с файлами без расширения или с несколькими точками.
- Реальные примеры кода для копирования.
Метод 1: Классика — pathinfo()
Если вы спросите любого PHP-разработчика со стажем, как получить расширение файла, он, не задумываясь, ответит: pathinfo(). Это самый популярный и рекомендуемый способ. Функция возвращает массив с информацией о пути: директория, имя файла, расширение и полное имя.
<?php
$file = 'document.pdf';
$extension = pathinfo($file, PATHINFO_EXTENSION);
echo $extension; // Выведет: pdf
?>
Красота этого метода в его простоте и читаемости. Вы передаёте имя файла и константу PATHINFO_EXTENSION — и получаете чистый результат без лишних символов. pathinfo() корректно обрабатывает большинство стандартных случаев, включая файлы с несколькими точками, например archive.tar.gz — в этом случае он вернёт gz, что логично, так как это конечное расширение.
Плюсы: интуитивно понятно, встроенная функция, работает с путями любой сложности.
Минусы: может вернуть пустую строку, если у файла нет расширения.
Метод 2: Работаем со строками — strrchr() + substr()
Иногда в легаси-коде или в учебных примерах можно встретить ручной парсинг. Идея проста: найти последнюю точку в строке и взять всё, что после неё.
<?php
$file = 'image.jpg';
$extension = substr(strrchr($file, '.'), 1);
echo $extension; // Выведет: jpg
?>
Функция strrchr() находит последнее вхождение символа и возвращает всё, начиная с него (включая точку). substr() с параметром 1 отсекает точку. Работает надёжно, но код получается менее читаемым.
Интересный факт: этот метод — прямой наследник эпохи C-подобных функций. Он быстрее pathinfo() в микро-бенчмарках, но в реальных проектах разница незаметна. Используйте его, если пишете высоконагруженный парсер и каждая микросекунда на счету.
Метод 3: Быстрый и грязный — explode()
Самый наивный способ, который приходит в голову новичкам: разбить строку по точке и взять последний элемент массива.
<?php
$file = 'report.xlsx';
$parts = explode('.', $file);
$extension = end($parts);
echo $extension; // Выведет: xlsx
?>
Внимание: это плохая практика. Почему? Представьте файл my.file.name.txt. explode() разобьёт его на 4 части, и end() вернёт txt. Вроде бы верно. Но что, если файл называется .htaccess? Массив будет ['', 'htaccess'], и расширение вернётся как htaccess, хотя это имя файла целиком. Или файл без расширения — вернётся само имя.
Этот метод стоит использовать только в учебных целях или когда вы точно уверены в структуре входных данных.
Метод 4: Современный ООП-подход — SplFileInfo
PHP — это не только процедурный стиль. Если вы используете объектно-ориентированное программирование (а в 2025 году это стандарт), то класс SplFileInfo — ваш выбор.
<?php
$file = new SplFileInfo('presentation.pptx');
$extension = $file->getExtension();
echo $extension; // Выведет: pptx
?>
Этот метод особенно удобен, когда вам нужно работать с файлом как с объектом: проверять существование, размер, дату изменения. SplFileInfo также корректно обрабатывает пути, включая относительные и абсолютные.
Важно: Метод getExtension() появился в PHP 5.3.9, но настоящую популярность обрёл с внедрением ООП в современных фреймворках (Laravel, Symfony). Если ваш проект использует типизацию и dependency injection — берите SplFileInfo.
Метод 5: Регулярные выражения — preg_match()
Для любителей изящных (или избыточных) решений — регулярные выражения. Этот метод оправдан, если вам нужно не просто получить расширение, а сразу проверить его на соответствие шаблону (например, только изображения).
<?php
$file = 'photo.jpeg';
preg_match('/\.([a-zA-Z0-9]+)$/', $file, $matches);
$extension = $matches[1] ?? '';
echo $extension; // Выведет: jpeg
?>
Регулярное выражение ищет точку, после которой идут буквы и цифры до конца строки. Результат захватывается в первую группу. Этот метод даёт полный контроль, но снижает читаемость кода. Используйте его, когда нужно отфильтровать расширения на лету.
Сравнительная таблица методов
Чтобы выбрать лучший метод для вашей задачи, взгляните на эту таблицу:
| Метод | Простота | Производительность | Безопасность | Рекомендация |
|---|---|---|---|---|
pathinfo() |
⭐️⭐️⭐️⭐️⭐️ | ⭐️⭐️⭐️⭐️
БлогиРекомендаций по книгамЧитайте также |