Pathinfo: примеры (PHP)
pathinfo(string $path, int $flags = PATHINFO_ALL): array|stringФункция pathinfo() извлекает информацию о файловом пути. Она применяется для разбора строк, содержащих путь к файлу или директории, что удобно для получения имени файла, расширения, директории или базового имени без расширения.
Функция используется, когда требуется:
- Отделить имя файла от расширения.
- Получить родительскую директорию файла.
- Проанализировать URL или путь, переданный в виде строки.
Сигнатура функции:
pathinfo(string $path, int $flags = PATHINFO_ALL): mixed
Аргументы:
- $path (обязательный): строка, представляющая путь для анализа.
- $flags (опциональный): целочисленная константа, определяющая, какие компоненты пути возвращать.
Допустимые флаги:
- PATHINFO_DIRNAME – возвращает только директорию.
- PATHINFO_BASENAME – возвращает только базовое имя (имя файла с расширением).
- PATHINFO_EXTENSION – возвращает только расширение файла.
- PATHINFO_FILENAME – возвращает только имя файла без расширения.
- PATHINFO_ALL (по умолчанию) – возвращает ассоциативный массив со всеми элементами.
Использование с разными флагами:
$path = '/var/www/site/img/photo.jpg';
print_r(pathinfo($path));
Array
(
[dirname] => /var/www/site/img
[basename] => photo.jpg
[extension] => jpg
[filename] => photo
)
echo pathinfo($path, PATHINFO_EXTENSION); // jpg
echo pathinfo($path, PATHINFO_BASENAME); // photo.jpg
echo pathinfo($path, PATHINFO_FILENAME); // photo
echo pathinfo($path, PATHINFO_DIRNAME); // /var/www/site/img
jpg photo.jpg photo /var/www/site/img
Обработка пути без расширения:
$path = '/home/user/data';
print_r(pathinfo($path));
Array
(
[dirname] => /home/user
[basename] => data
[filename] => data
)
Работа с URL и сложными именами:
$url = 'https://example.com/docs/file.tar.gz?download=true';
$parsed = pathinfo(parse_url($url, PHP_URL_PATH));
echo $parsed['extension'];
gz
В PHP существуют другие функции для работы с путями:
- basename() – возвращает последний компонент пути (аналог PATHINFO_BASENAME). Отличается возможностью удалить суффикс.
- dirname() – возвращает родительскую директорию (аналог PATHINFO_DIRNAME). В PHP 7.0+ принимает параметр уровня.
- parse_url() – специализируется на разборе URL, а не файловых путей.
- explode() – ручное разделение строки по разделителю (например, '/'). Менее удобно для сложных случаев.
Функцию pathinfo() предпочтительнее использовать для комплексного разбора стандартных файловых путей. basename() и dirname() удобны для получения одного компонента. Для URL сначала применяют parse_url(), а затем, возможно, pathinfo() для части пути.
1. Ожидание расширения для файла без него или с несколькими точками.
$path = '/home/user/file.tar.gz';
$info = pathinfo($path);
echo $info['extension']; // Выведет только 'gz', а не 'tar.gz'gz
2. Передача некорректного типа аргумента.
$result = pathinfo(['not a string']);
var_dump($result);В PHP 8: TypeError: pathinfo(): Argument #1 ($path) must be of type string, array given
3. Неправильная интерпретация пути, содержащего параметры запроса или фрагменты URL.
$url = 'script.php?page=1';
$info = pathinfo($url);
echo $info['basename']; // 'script.php?page=1', а не 'script.php'script.php?page=1
4. Обработка пустой строки или строки, состоящей только из разделителей.
$info = pathinfo('');
var_dump($info);array(2) {
["basename"]=>
string(0) ""
["filename"]=>
string(0) ""
}
- В PHP 5.2.0 добавлена константа PATHINFO_FILENAME.
- В PHP 7.1.0 параметр $path стал допускать значение null, которое трактуется как пустая строка (поведение устарело).
- В PHP 8.0.0 параметр $path больше не принимает null. Передача нестрокового значения вызывает TypeError.
- В PHP 8.4.0 (на момент написания) существенных изменений в поведении функции не зафиксировано.
$files = [
'/docs/report.pdf',
'image.png',
'archive.tar.gz',
'/usr/local/bin/' // Директория
];
foreach ($files as $file) {
$info = pathinfo($file);
echo "Имя: " . ($info['filename'] ?? '-') . ", Расширение: " . ($info['extension'] ?? 'нет') . "
";
}Имя: report, Расширение: pdf
Имя: image, Расширение: png
Имя: archive, Расширение: gz
Имя: bin, Расширение: нет
function safeExtension($path) {
$info = pathinfo($path);
return isset($info['extension']) ? strtolower($info['extension']) : '';
}
echo safeExtension('FILE.PNG'); // png
echo safeExtension('/path/noext'); // пустая строкаpng
$url = 'https://site.com/path/to/script.php?id=5#section';
$path = parse_url($url, PHP_URL_PATH);
$info = pathinfo($path);
echo $info['filename']; // scriptscript
Для получения части имени до последней точки можно использовать комбинацию функций.
$path = '/tmp/archive.tar.gz';
$info = pathinfo($path);
$nameWithoutLastExt = $info['dirname'] . '/' . $info['filename']; // /tmp/archive.tar
echo $nameWithoutLastExt;
/tmp/archive.tar
function changeExtension($path, $newExt) {
$info = pathinfo($path);
return ($info['dirname'] !== '.' ? $info['dirname'] . '/' : '') . $info['filename'] . '.' . $newExt;
}
echo changeExtension('/var/log/app.log', 'txt'); // /var/log/app.txt
echo changeExtension('data.json', 'bak'); // data.bak/var/log/app.txt data.bak
$winPath = 'C:\Users\Admin\file.txt';
$info = pathinfo($winPath);
print_r($info);Array
(
[dirname] => C:\Users\Admin
[basename] => file.txt
[extension] => txt
[filename] => file
)
Pathinfo в Python
Модуль os.path и pathlib (Python 3.4+).
from os import path
print(path.splitext('/var/www/file.txt'))
print(path.basename('/var/www/file.txt'))
print(path.dirname('/var/www/file.txt'))('/var/www/file', '.txt')
file.txt
/var/wwwМодуль path.
const path = require('path');
console.log(path.parse('/var/www/file.txt'));
console.log(path.extname('/var/www/file.txt'));{
root: '/',
dir: '/var/www',
base: 'file.txt',
ext: '.txt',
name: 'file'
}
.txtPathinfo в MySQL
Функции для работы со строками, например, SUBSTRING_INDEX(). Специальной функции нет.
SELECT SUBSTRING_INDEX('/var/www/file.txt', '/', -1) AS basename;file.txt
Основное отличие PHP-функции – возвращение данных в виде массива по одному вызову и наличие флагов для выбора компонента. В Python и JS подход более объектно-ориентированный или разбитый на несколько функций.