Как получить имя файла из полного пути в PHP
Основные способы получения имени файла из пути
При работе с файлами в PHP часто требуется извлечь только имя файла из полного пути, например, для отображения пользователю или сохранения в лог. Рассмотрим несколько подходов, от наиболее эффективного до альтернативных решений.
Как получить имя файла самым простым и быстрым способом?
Наиболее эффективное решение - функция basename(). Она возвращает последний компонент пути, то есть имя файла. Функция принимает путь и опционально суффикс, который будет удален из результата, если он присутствует.
$path = '/var/www/html/index.php';
$filename = basename($path);
echo $filename; // index.php
Php редактировать файл (редактирование содержимого файла в php)
index.php
Php заменить файл (замена содержимого файла в php (перезапись))
Функция корректно обрабатывает как Unix (/), так и Windows пути (\) .
Проблемы: basename не проверяет, существует ли файл на самом деле. Она просто обрабатывает строку. Для проверки существования используйте file_exists().
Как получить имя файла вместе с расширением или отдельно расширение?
Функция pathinfo() возвращает массив с информацией о пути: dirname, basename, extension, filename. Можно получить как полное имя, так и отдельные части.
$path = '/var/www/html/script.php';
$info = pathinfo($path);
echo $info['basename']; // script.php
echo $info['filename']; // script
echo $info['extension']; // php
Php получить имя файла (получение имени файла из пути в php)
script.php script php
Php информация о файле (получение информации о файле в php)
Проблемы: Если путь не содержит расширения, ключ 'extension' пуст. Для относительных путей pathinfo может вернуть неверный dirname.
Этот подход удобен, когда нужны дополнительные данные о пути.
Как извлечь имя файла, если разделитель директорий неизвестен?
Можно использовать explode() с разделителем DIRECTORY_SEPARATOR, но это не единая константа для всех систем. Универсальный вариант - разбить строку по обоим возможным разделителям с помощью регулярного выражения или множественных вызовов explode. Простой способ - использовать basename, но если нужна ручная реализация:
$path = 'C:\projects\app\file.txt';
$parts = preg_split('/[\/\\\\]/', $path);
$filename = end($parts);
echo $filename; // file.txt
Php переименовать файл (переименование файла в php)
file.txt
Проблемы: Если путь заканчивается разделителем, end() вернет пустую строку. Необходима дополнительная проверка.
Как вручную получить имя файла с помощью строковых функций?
Метод с strrpos() и substr() позволяет найти последний разделитель и взять часть строки после него. Это более низкоуровневый подход.
$path = '/home/user/docs/report.pdf';
$pos = strrpos($path, '/');
if ($pos !== false) {
$filename = substr($path, $pos + 1);
} else {
$filename = $path; // нет разделителя
}
echo $filename; // report.pdf
report.pdf
Проблемы: Необходимо учитывать разные разделители (/) и (\) . Для Windows нужен дополнительный поиск. Решение не такое компактное, как basename.
Как применить регулярное выражение для извлечения имени файла?
Регулярное выражение может извлечь последний сегмент пути. Однако такой подход менее предпочтителен из-за производительности и читаемости.
$path = 'ftp://example.com/pub/data.csv';
preg_match('/([^\/]+)$/', $path, $matches);
$filename = $matches[1];
echo $filename; // data.csv
data.csv
Проблемы: Регулярное выражение может дать сбой при наличии символов подстановки или путей с пробелами. Также зависит от правильного экранирования.
Дополнительные примеры и нестандартные случаи
Рассмотрим более сложные сценарии получения имени файла из пути.
Использование basename с суффиксом для удаления расширения
$path = '/images/photo.jpg';
$name = basename($path, '.jpg'); // photo
$name_ext = basename($path); // photo.jpg
photo photo.jpg
Обработка Windows путей с разными разделителями
$winPath = 'C:\Users\Admin\Documents\file.docx';
$unixPath = '/var/log/error.log';
echo basename($winPath); // file.docx
echo basename($unixPath); // error.log
file.docx error.log
Извлечение имени файла из URL
$url = 'https://site.com/assets/style.css?v=1.0';
$basename = basename(parse_url($url, PHP_URL_PATH));
echo $basename; // style.css
style.css
Использование DirectoryIterator для извлечения имени файла из объекта SplFileInfo
$path = '/tmp/';
$iterator = new DirectoryIterator($path);
foreach ($iterator as $fileinfo) {
if ($fileinfo->isFile()) {
echo $fileinfo->getFilename() . '\n';
// или $fileinfo->getBasename()
}
}
(выводит имена файлов в каталоге)
Работа с некорректными путями (пустая строка, только разделитель)
$paths = ['', '/', '/usr/', 'file.txt'];
foreach ($paths as $p) {
$name = basename($p) ?: 'empty';
echo "path: '$p' -> name: '$name'\n";
}
path: '' -> name: 'empty' path: '/' -> name: '' path: '/usr/' -> name: 'usr' path: 'file.txt' -> name: 'file.txt'
Использование pathinfo с опциями для получения отдельных компонентов
$path = '/archive/2025/report.tar.gz';
$basename = pathinfo($path, PATHINFO_BASENAME); // report.tar.gz
$filename = pathinfo($path, PATHINFO_FILENAME); // report.tar
$extension = pathinfo($path, PATHINFO_EXTENSION); // gz
echo $basename . ' ' . $filename . ' ' . $extension;
report.tar.gz report.tar gz
Ручной разбор пути с использованием pathinfo и обработка ошибок
function getFilenameSafe($path) {
if (empty($path)) return null;
if (strpos($path, '://') !== false) {
// это URL
$path = parse_url($path, PHP_URL_PATH);
}
$info = pathinfo($path);
return $info['basename'] ?? null;
}
echo getFilenameSafe('https://example.com/dir/file.php?q=1'); // file.php
file.php
Различные типы путей: относительные, с точкой, без расширения
$paths = [
'./readme.txt',
'path/to/.hidden',
'somefile',
'/root/'
];
foreach ($paths as $p) {
echo basename($p) . ' - ' . pathinfo($p, PATHINFO_FILENAME) . '\n';
}
readme.txt - readme .hidden - .hidden somefile - somefile - (пусто)