PHP, получить имя файла без расширения файла - PullRequest
169 голосов
/ 02 февраля 2010

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

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

Ответы [ 17 ]

331 голосов
/ 02 февраля 2010

Нет необходимости во всем этом.Проверьте 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
189 голосов
/ 02 февраля 2010

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

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

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

57 голосов
/ 27 сентября 2013

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

pathinfo($path, PATHINFO_FILENAME);

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

12 голосов
/ 21 марта 2014

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

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

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

11 голосов
/ 04 июня 2015

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

 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

7 голосов
/ 27 января 2017

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

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

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

Объяснение

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

7 голосов
/ 02 февраля 2010

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

$filename = end(explode(".", $file));
5 голосов
/ 10 февраля 2018

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

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

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

Будет напечатано

logo

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

4 голосов
/ 27 июля 2015

в моем случае, я использую ниже. Мне все равно, что его расширение. : 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.
4 голосов
/ 02 мая 2013

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

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

$file = basename($path, ".".$ext); // $file is set to "index"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...