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.