PHP, получить имя файла без расширения файла


205

У меня есть этот код PHP:

function ShowFileExtension($filepath)
{
    preg_match('/[^?]*/', $filepath, $matches);
    $string = $matches[0];

    $pattern = preg_split('/\./', $string, -1, PREG_SPLIT_OFFSET_CAPTURE);

    if(count($pattern) > 1)
    {
        $filenamepart = $pattern[count($pattern)-1][0];
        preg_match('/[^?]*/', $filenamepart, $matches);
        return strtolower($matches[0]);
    }
}

Если у меня есть файл с именем my.zip, эта функция возвращает .zip.

Я хочу сделать наоборот, я хочу, чтобы функция возвращалась myбез расширения.

Файл - это просто строка в переменной.


Ответы:


398

Нет необходимости во всем этом. Проверьте pathinfo () , он дает вам все компоненты вашего пути.

Пример из руководства:

$path_parts = pathinfo('/www/htdocs/index.html');

echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // filename is only since PHP 5.2.0

Вывод кода:

/www/htdocs
index.html
html
index

И наоборот, вы можете получить только определенные части, такие как:

echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html

3
Почему это было отвергнуто? Ответ абсолютно правильный. pathinfo работает со строками, поэтому не имеет значения, находится файл на самом деле на сервере или нет.
— Гордон

13
К сожалению, они ошибочно назвали «базовое имя», так как оно возвращает полное имя файла с расширением, а не базовое имя.
— Оскар

1
@ Оскар это наиболее широко понимаемый смысл этого термина basename. Нет неправильного названия.
— Nawfal

1
Это очень полезно, особенно когда вам не нужно знать расширение файла для его извлечения.
— Вахид Амири

Это чрезвычайно элегантное решение. Престижность. Это должно быть помечено как правильный ответ.
— Родной кодер

199

В качестве альтернативы pathinfo()вы можете использовать

  • basename() - возвращает имя файла компонента пути

Пример из руководства по PHP

$path = "/home/httpd/html/index.php";
$file = basename($path);         // $file is set to "index.php"
$file = basename($path, ".php"); // $file is set to "index"

Вы должны знать расширение, чтобы удалить его заранее, хотя.

Тем не менее, поскольку ваш вопрос говорит о том, что вам нужно получить расширение и базовое имя, я бы оценил ответ Пекки как наиболее полезный, потому что он даст вам любую информацию о пути и файле, которую вы хотите получить, с одним родным функция.


1
Что делать, если я не знаю о расширении файла .. скажем, если путь является динамическим, любой тип расширения файла может войти в него! тогда что ??
— user889030 13.12.16

@ user889030, тогда у вас другой сценарий, чем OP, и вы не используете его basename, но, pathinfoкак показано в другом месте, были на странице.
— Гордон

72

https://php.net/manual/en/function.pathinfo.php

pathinfo($path, PATHINFO_FILENAME);

Простой функциональный тест: https://ideone.com/POhIDC


Это вернет имя файла с расширением
— user966939

2
@ user966939 Mhh, нет с расширением basename;-)
— yckart

Ну, так или иначе, он просил решение БЕЗ расширения. ;)
— user966939

2
@ user966939, чувак, расширения вообще нет. Это PATHINFO_FILENAMEне PATHINFO_EXTENSION ....
— Пейсер

20
Кто бы ни решил, что у filenameнего нет расширения, у basenameнего должны быть некоторые садистские тенденции ...
— Марк

12

Другой подход заключается в использовании регулярных выражений.

$fileName = basename($filePath);
$fileNameNoExtension = preg_replace("/\.[^.]+$/", "", $fileName);

Это удаляет с последнего периода .до конца строки.


Мне нравится этот ответ, очень простой и работает, когда вы не знаете расширение.
— Отпуск

Гораздо лучше, чем использование explode, и перехватывает только последний период, если вы использовали периоды в именах файлов
— Kiwizoom

7
Нет , все намного хуже. Хватит сглаживать людей.
— Pacerier

Спасибо, и вышеупомянутые комментарии прибили это. Отсутствие необходимости знать расширение делает это более полезным.
— Джеймс Тейлор

1
@ caiosm1005, поверхность атаки сразу увеличивается, потому что трудно рассуждать о внутренностях движка регулярных выражений. Например, в приведенном выше коде не было бы странно, если бы был какой-то ввод, $fileNameкоторый мог бы заставить двигатель работать в экспоненциальном (или худшем) времени. И, предполагая, что мы закончили анализ внутренних элементов этого конкретного механизма регулярных выражений и теоретически доказали, что он устойчив к любым возможным значениям $fileName, код все еще не может быть произвольно переносим на другую платформу, которая имеет другую реализацию механизма регулярных выражений.
— Pacerier

12

Если расширение не известно, используйте это решение

 pathinfo('D:/dir1/dir2/fname', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.php', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "fname"

 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_DIRNAME) . '/' . pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "D:/dir1/dir2/fname"

PHP MAN функция pathinfo


Пожалуйста, укажите как на странице справки php для pathinfo. Это поможет OP ShowFileExtensionулучшить метод и обеспечит дополнительное чтение для всех, кто пытается найти этот ответ. Также немного описания не сбилось бы с пути ...
— Майкл Коксон

1
Я уже ответил на этот вопрос тем же решением, за 2 года до твоего;)
— yckart

@yckart true, но это дает несколько примеров в ответе. У вас есть возможность ссылки на ideone.com, но сайт может отключиться.
— Адам Элсодани

7

@Gordon basename будет работать нормально, если вы знаете расширение, если вы не можете использовать explode:

$filename = end(explode(".", $file));

1
Пожалуйста, направляйте мне комментарии с помощью функции комментариев под моим ответом. Наиболее подходящей функцией для этого является pathinfo, поэтому я дал только basenameв качестве альтернативы. Нет необходимости заново изобретать pathinfoс помощью регулярных выражений или explode.
— Гордон

4
@fire, твое обновление не имеет смысла. end(explode(".", $file));дает вам расширение, а не имя файла.
— Pacerier

7

Почти все вышеприведенные решения имеют показанное имя файла из переменной $ path

Ниже приведен фрагмент текущего имени исполняемого файла без расширения.

echo pathinfo(basename($_SERVER['SCRIPT_NAME']), PATHINFO_FILENAME);

объяснение

$ _SERVER ['SCRIPT_NAME'] содержит путь к текущему сценарию.


7

Там нет необходимости писать много кода. Даже это может быть сделано только одной строкой кода. Смотри здесь

Ниже приведен однострочный код, который возвращает только имя файла и удаляет расширение:

<?php
 echo pathinfo('logo.png')['filename'];
?>

Будет печатать

logo

Источник: Удалить расширение и вернуть только имя файла в PHP


4

@fire, если имя файла использует точки, вы можете получить неправильный вывод. Я бы использовал метод @Gordon, но тоже получил расширение, поэтому функция basename работает со всеми расширениями, например так:

$path = "/home/httpd/html/index.php";
$ext = pathinfo($path, PATHINFO_EXTENSION);

$file = basename($path, ".".$ext); // $file is set to "index"

4

в моем случае я использую ниже. Мне все равно, что это такое. Я думаю, это поможет вам

$exploded_filepath = explode(".", $filepath_or_URL);
$extension = end($exploded_filepath);
echo basename($filepath_or_URL, ".".$extension ); //will print out the the name without extension.

Кстати: у вас есть опечатка$extenion
— Томас Кекейсен

2

Вы можете написать это

$filename = current(explode(".", $file));

Они вернут текущий элемент массива, если не использовались ранее.


Здравствуйте, пожалуйста, проверьте, прежде чем понизить его. Это работает, я использовал это в своем коде много раз. Используя эту функцию, вы можете получить только имя файла, если у вас имя файла "xyz.jpg". Может не работать с именами файлов, содержащими весь путь в нем.
— Джитендра Павар

Это также не работает должным образом, если имя файла содержит несколько точек в нем, например , «some.interesting.image.jpg»
— ganzpopp

2

короткий

echo pathinfo(__FILE__)['filename']; // since php 5.2

хорошо. Но если я ставлю выше коды b.phpи я казнен a.phpимея require('b.php'). Тогда выходной будет какb вместоa
— Рохан Худе

1

Имя файла без расширения, если вы не знаете это расширение:

$basename = substr($filename, 0, strrpos($filename, "."));


2
Как насчет того, чтобы расширение было чем-то вроде .tar.gz?
— Арда

1

Если вы не знаете, какое у вас расширение, вы можете попробовать это:

$ext = strtolower(substr('yourFileName.ext', strrpos('yourFileName.ext', '.') + 1));
echo basename('yourFileName.ext','.'.$ext); // output: "youFileName" only

Работаем со всеми возможностями:

image.jpg // output: "image"
filename.image.png // output: "filename.image"
index.php // output: "index"

1

Ваш ответ ниже идеального решения, чтобы скрыть расширение файла в php.

<?php
    $path = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    echo basename($path, ".php");
?>

1

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

function removeExt($path)
{
    $basename = basename($path);
    return strpos($basename, '.') === false ? $path : substr($path, 0, - strlen($basename) + strlen(explode('.', $basename)[0]));
}

echo removeExt('https://example.com/file.php');
// https://example.com/file
echo removeExt('https://example.com/file.tar.gz');
// https://example.com/file
echo removeExt('file.tar.gz');
// file
echo removeExt('file');
// file

0

Это возвращает только имя файла без какого-либо расширения в 1 строке:

$path = "/etc/sudoers.php";    
print array_shift(explode(".", basename($path)));
// will print "sudoers"

$file = "file_name.php";    
print array_shift(explode(".", basename($file)));
// will print "file_name"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.