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

У меня есть этот код 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 без расширения.

Файл представляет собой просто строку в переменной.

Ответ 1

Не нужно этого. Проверьте 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

Ответ 2

В качестве альтернативы 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"

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

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

Ответ 4

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

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

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

Ответ 5

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

 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 function pathinfo

Ответ 6

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

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

Ответ 7

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

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

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

Объяснение

$_ SERVER ['SCRIPT_NAME'] содержит путь к текущему script.

Ответ 8

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

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

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

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

logo

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

Ответ 9

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

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

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

Ответ 10

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

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

Ответ 11

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

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

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

Ответ 12

Короткая

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

Ответ 13

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

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

Ответ 14

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

$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"

Ответ 15

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

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

Ответ 16

Это возвращает только имя файла без расширения в 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"

Ответ 17

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

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