Pathinfo: примеры (PHP)

Использование pathinfo для анализа путей в PHP
Раздел: Работа с файловой системой
pathinfo(string $path, int $flags = PATHINFO_ALL): array|string
Функция pathinfo() в PHP

Функция pathinfo() извлекает информацию о файловом пути. Она применяется для разбора строк, содержащих путь к файлу или директории, что удобно для получения имени файла, расширения, директории или базового имени без расширения.

Функция используется, когда требуется:

  • Отделить имя файла от расширения.
  • Получить родительскую директорию файла.
  • Проанализировать URL или путь, переданный в виде строки.

Сигнатура функции:

pathinfo(string $path, int $flags = PATHINFO_ALL): mixed

Аргументы:

  • $path (обязательный): строка, представляющая путь для анализа.
  • $flags (опциональный): целочисленная константа, определяющая, какие компоненты пути возвращать.

Допустимые флаги:

  • PATHINFO_DIRNAME – возвращает только директорию.
  • PATHINFO_BASENAME – возвращает только базовое имя (имя файла с расширением).
  • PATHINFO_EXTENSION – возвращает только расширение файла.
  • PATHINFO_FILENAME – возвращает только имя файла без расширения.
  • PATHINFO_ALL (по умолчанию) – возвращает ассоциативный массив со всеми элементами.
Простое применение pathinfo()

Использование с разными флагами:

$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

В 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
  • В PHP 5.2.0 добавлена константа PATHINFO_FILENAME.
  • В PHP 7.1.0 параметр $path стал допускать значение null, которое трактуется как пустая строка (поведение устарело).
  • В PHP 8.0.0 параметр $path больше не принимает null. Передача нестрокового значения вызывает TypeError.
  • В PHP 8.4.0 (на момент написания) существенных изменений в поведении функции не зафиксировано.
Расширенные примеры pathinfo()
Обработка массива путей
Пример php
$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, Расширение: нет
Безопасное извлечение расширения
Пример php
function safeExtension($path) {
    $info = pathinfo($path);
    return isset($info['extension']) ? strtolower($info['extension']) : '';
}
echo safeExtension('FILE.PNG'); // png
echo safeExtension('/path/noext'); // пустая строка
png
Комбинирование с parse_url
Пример php
$url = 'https://site.com/path/to/script.php?id=5#section';
$path = parse_url($url, PHP_URL_PATH);
$info = pathinfo($path);
echo $info['filename']; // script
script
Множественное расширение файла

Для получения части имени до последней точки можно использовать комбинацию функций.

Пример php
$path = '/tmp/archive.tar.gz';
$info = pathinfo($path);
$nameWithoutLastExt = $info['dirname'] . '/' . $info['filename']; // /tmp/archive.tar
echo $nameWithoutLastExt;
/tmp/archive.tar
Создание нового пути с изменением расширения
Пример php
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
Анализ пути в Windows-стиле
Пример php
$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
JavaScript (Node.js)

Модуль 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'
}
.txt

Pathinfo в MySQL

Функции для работы со строками, например, SUBSTRING_INDEX(). Специальной функции нет.

SELECT SUBSTRING_INDEX('/var/www/file.txt', '/', -1) AS basename;
file.txt

Основное отличие PHP-функции – возвращение данных в виде массива по одному вызову и наличие флагов для выбора компонента. В Python и JS подход более объектно-ориентированный или разбитый на несколько функций.

PHP pathinfo function comments

En
Pathinfo Returns information about a file path