Basename: примеры (PHP)
basename(string $path, string $suffix = ""): stringФункция basename в PHP предназначена для получения последнего компонента из пути к файлу или директории. Она возвращает только имя файла или конечной директории из переданного строкового пути. Функция часто используется при обработке загруженных файлов, работе с файловой системой, анализе URL-адресов или логов, когда из полного пути требуется извлечь только название.
Функция имеет следующий синтаксис и принимает два аргумента:
basename(string $path, string $suffix = ""): string
- $path (string): Обязательный параметр. Путь к файлу или директории, из которого необходимо извлечь конечное имя. В качестве разделителей директорий могут использоваться как прямые слеши (/), так и обратные (\), однако на платформах Windows обратный слэш будет преобразован.
- $suffix (string): Необязательный параметр. Если конечный компонент пути заканчивается строкой $suffix, то эта строка будет удалена из результата. Это полезно для удаления расширения файла (например, .php). Удаление чувствительно к регистру.
echo basename('/var/www/html/index.php');index.php
echo basename('/var/www/html/index.php', '.php');
echo basename('archive.tar.gz', '.gz');index archive.tar
echo basename('C:\\Projects\\report.txt');report.txt
echo basename('https://site.com/blog/post-123.html');
echo basename('/home/user/docs/'); // Путь заканчивается слешем
echo basename('.'); // Текущая директория
echo basename('..'); // Родительская директорияpost-123.html docs . ..
В PHP существуют другие функции для разбора путей, которые могут использоваться совместно или вместо basename.
- pathinfo() - Возвращает ассоциативный массив с информацией о пути: имя директории, базовое имя, расширение и имя файла без расширения. Удобна для комплексного анализа пути.
print_r(pathinfo('/var/www/data.txt'));Array ( [dirname] => /var/www [basename] => data.txt [extension] => txt [filename] => data ) - dirname() - Возвращает родительскую директорию пути, т.е. всё, кроме последнего компонента. Функция, обратная по смыслу basename.
echo dirname('/var/www/data.txt');/var/www
- realpath() - Возвращает канонизированный абсолютный путь, убирая символические ссылки и переходы типа '/./', '/../'. Не извлекает имя файла, но часто используется перед basename для нормализации пути.
pathinfo() предпочтительнее, когда нужны несколько компонентов пути одновременно. basename() эффективнее для получения только конечного имени, особенно с параметром suffix.
Параметр $suffix удаляется только при точном совпадении регистра.
echo basename('/var/www/file.PHP', '.php'); // Суффикс не будет удаленfile.PHP
Функция не является безопасной для многобайтовых кодировок (UTF-8). Для путей с символами, выходящими за пределы ASCII (например, кириллицей), следует использовать mb_basename, которую нужно реализовать самостоятельно.
function mb_basename($path, $suffix = '') {
$path = str_replace('\\', '/', $path);
$path = rtrim($path, '/');
$pos = mb_strrpos($path, '/');
if ($pos !== false) {
$name = mb_substr($path, $pos + 1);
} else {
$name = $path;
}
if ($suffix !== '' && mb_substr($name, -mb_strlen($suffix)) === $suffix) {
$name = mb_substr($name, 0, -mb_strlen($suffix));
}
return $name;
}
echo mb_basename('/var/www/файл.txt', '.txt');файл
Функция корректно обрабатывает такие случаи, но результат может быть неочевидным.
echo basename('/var/www/html/');html
В PHP 8.0 не было внесено значительных изменений в работу функции basename(). Однако начиная с PHP 7.0 поведение функции было уточнено: теперь она всегда возвращает строку, а в случае передачи нестроковых аргументов генерируется ошибка уровня E_WARNING (ранее она могла возвращать false). Параметр $suffix был добавлен еще в ранних версиях, но его поддержка стала стабильной и документированной с PHP 4. В PHP 5.2.2 было исправлено поведение с обратными слешами на Windows-платформах.
$files = [
'/var/log/apache/access.log',
'C:\\Users\\Public\\Documents\\report.pdf',
'https://example.com/images/photo.jpg'
];
$names = array_map('basename', $files);
print_r($names);Array
(
[0] => access.log
[1] => report.pdf
[2] => photo.jpg
)$path = '/tmp/backup.tar.gz';
$name = basename($path);
// Удаляем по очереди возможные расширения архива
$name_no_ext = basename($name, '.gz');
$name_no_ext = basename($name_no_ext, '.tar');
echo $name_no_ext;backup
$url = 'https://api.service.com/v1/download/file?id=123&token=abc';
// Сначала извлекаем путь после домена, затем имя файла
$path = parse_url($url, PHP_URL_PATH);
$filename = $path ? basename($path) : '';
echo $filename;file
function compare_base_names($path1, $path2) {
$name1 = basename($path1, '.php');
$name2 = basename($path2, '.php');
return $name1 === $name2;
}
$result = compare_base_names('/app/index.php', '/backup/index.bak');
var_dump($result);bool(false)
$user_file_path = '../../etc/passwd';
$safe_name = basename($user_file_path); // Только имя, без обхода директорий
echo $safe_name;passwd
Basename в Python
В модуле os.path есть функция basename(), работающая аналогично. В Python также есть Path из модуля pathlib для ООП-подхода.
import os
print(os.path.basename('/var/www/html/index.php'))
# Удаление суффикса не встроено, используется os.path.splitext
print(os.path.splitext(os.path.basename('/var/www/html/index.php'))[0])index.php index
В Node.js используется метод path.basename() из модуля 'path'. Его синтаксис очень близок к PHP, включая параметр suffix.
const path = require('path');
console.log(path.basename('/var/www/html/index.php'));
console.log(path.basename('/var/www/html/index.php', '.php'));index.php index
Basename в MySQL
Прямого аналога нет, но можно использовать строковые функции, например, SUBSTRING_INDEX() для извлечения последней части строки после последнего разделителя.
SELECT SUBSTRING_INDEX('/var/www/html/index.php', '/', -1) AS basename;basename index.php
Основное отличие PHP-функции - встроенная возможность удаления суффикса и обработка различных типов разделителей пути.