Как получить расширение файла в PHP: лучшие практики 2025

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Как получить расширение файла в PHP: от новичка до профи в 2025 году

Вы когда-нибудь задумывались, сколько раз в день PHP-разработчику приходится извлекать расширение файла? Десятки, если не сотни. Загрузка аватарок, обработка документов, валидация изображений — везде нужно понять, что за зверь к вам прилетел: .jpg, .pdf или хитрый .php.jpg.

Вопрос "How can I get a file's extension in PHP?" — один из самых популярных на Stack Overflow. И неспроста. Казалось бы, что может быть проще? Но дьявол, как всегда, в деталях. В 2025 году у нас есть не только старые добрые pathinfo() и explode(), но и новые возможности PHP 8.4, которые делают код чище и безопаснее.

Давайте разберём 5 рабочих способов, их плюсы, минусы и когда что использовать. Поехали!

1. Классика жанра: pathinfo() — король всех методов

Самый популярный и правильный способ — функция pathinfo(). Она появилась ещё в PHP 4 и до сих пор не теряет актуальности. Почему? Потому что она умная: учитывает системные разделители путей, работает с URL и не ломается на точках в имени файла.

<?php
$file = 'document.report.pdf';
$extension = pathinfo($file, PATHINFO_EXTENSION);
// Результат: 'pdf'
?>

Но есть нюанс. Если файл не имеет расширения, pathinfo() вернёт пустую строку. Не null, не false — а именно пустую строку. Это важно для строгих проверок.

<?php
$file = 'README';
$ext = pathinfo($file, PATHINFO_EXTENSION);
var_dump($ext); // string(0) ""
?>

Когда использовать: всегда, когда нужно быстро и надёжно получить расширение. Это стандарт индустрии.

2. Старый школьный метод: explode() и strrpos()

Некоторые разработчики старой закалки любят ручной разбор строк. Идея простая: найти последнюю точку и взять всё после неё.

<?php
$file = 'image.jpg';
$parts = explode('.', $file);
$extension = end($parts);
// Результат: 'jpg'
?>

Вроде работает. Но есть подвох: explode() создаёт массив, а end() сдвигает внутренний указатель массива. Не критично, но неэлегантно.

Более производительный вариант — strrpos() + substr():

<?php
$file = 'archive.tar.gz';
$pos = strrpos($file, '.');
$extension = $pos !== false ? substr($file, $pos + 1) : '';
// Результат: 'gz'
?>

Обратите внимание: strrpos() ищет последнее вхождение точки. Это правильно — мы хотим именно gz, а не tar.gz.

Когда использовать: когда pathinfo() недоступен (экзотика) или нужно больше контроля над логикой.

3. Новинка 2025: str_contains() и str_starts_with()

В PHP 8.0 появились str_contains() и str_starts_with(), а в PHP 8.4 — улучшенная работа с многобайтовыми строками. Это открывает новые элегантные способы.

<?php
$file = 'photo.2025.jpg';

if (str_contains($file, '.')) {
    $extension = substr($file, strrpos($file, '.') + 1);
} else {
    $extension = '';
}
// Результат: 'jpg'
?>

Красиво? Не очень. Но если вам нужно проверить, является ли файл изображением, str_ends_with() — ваш друг:

<?php
$file = 'avatar.png';
$isImage = str_ends_with($file, '.png') || str_ends_with($file, '.jpg');
// true
?>

Когда использовать: для быстрых проверок конкретных расширений без извлечения всего расширения.

4. Регулярные выражения: когда нужно всё и сразу

Иногда одного расширения мало. Например, нужно проверить, что файл — это безопасное изображение, и заодно извлечь имя без расширения. Тут в игру вступают регулярные выражения.

<?php
$file = 'my_photo.JPG';
preg_match('/\.([a-zA-Z0-9]+)$/', $file, $matches);
$extension = isset($matches[1]) ? strtolower($matches[1]) : '';
// Результат: 'jpg'
?>

Регулярка /\.([a-zA-Z0-9]+)$/ ищет точку, после которой идут буквы или цифры до конца строки. Мы сразу приводим к нижнему регистру — хорошая практика для сравнения.

Когда использовать: когда нужна валидация "на лету" или извлечение сложных паттернов.

5. Объектный подход: SplFileInfo из SPL

Стандартная библиотека PHP (SPL) предлагает объектно-ориентированный способ работы с файлами. SplFileInfo — это мощный класс, который умеет многое.

<?php
$file = new SplFileInfo('document.pdf');
$extension = $file->getExtension();
// Результат: 'pdf'
?>

В PHP 8.4 SplFileInfo::getExtension() стал ещё быстрее и корректнее работает с символическими ссылками. Если вы уже используете объекты для работы с файлами — это ваш выбор.

Когда использовать: в крупных проектах, где файлы представлены объектами, а не строками.

Что выбрать в 2025? Сравнительная таблица

Давайте сведём всё в таблицу, чтобы было наглядно:

  • pathinfo() — лучший для 90% случаев. Просто, быстро, читаемо.
  • explode() + end() — для фанатов минимализма. Работает, но есть нюансы.
  • strrpos() + substr() — самый производительный. Без создания массивов.
  • Регулярные выражения — когда нужно больше, чем просто расширение.
  • SplFileInfo — для ООП-стиля и крупных проектов.

Лучшие практики: как не наступить на грабли

Теперь, когда вы знаете способы, поговорим о том, как не выстрелить себе в ногу.

1. Всегда приводите расширение к нижнему регистру

Файлы могут называться Image.JPG, image.jpg и даже ImAgE.JpG. Для сравнения используйте strtolower():

<?                

Блоги

Рекомендаций по книгам