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без розширення.

Файл - це лише рядок у змінній.


Відповіді:


397

Не потрібно в усьому цьому. Перевірте 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
@Oscar - це найпоширеніше значення цього терміна 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

@ user889030, тоді у вас інший сценарій, ніж ОП, і ви не використовуєте 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 ....
Pacerier

20
Той, хто вирішив, що filenameне має продовження, хоча basenameмає, має певні садистські тенденції ...
Марк

12

Інший підхід полягає у використанні регулярних виразів.

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

Це видаляється від останнього періоду .до кінця рядка.


Мені подобається ця відповідь, дуже проста і працює, коли ви не знаєте розширення.
реліз

Набагато краще, ніж використання
eksplode, і вибираєте

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


Будь ласка, вкажіть, як на сторінці man php для pathinfo. Це допоможе ОП покращити ShowFileExtensionметод і забезпечить додаткове читання для тих, хто намагається знайти цю відповідь. Також трохи опису не збилося б з глузду ...
Майкл Коксон

1
Я відповів на це питання вже тим самим рішенням, ~ 2 роки до вашого;)
yckart

@yckart правда, але це дає декілька прикладів у відповіді. Ваша користь має посилання на 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

у моєму випадку я використовую нижче. Мені байдуже, що це за її роздумка. : 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.

Дорога. У вас є друкарська помилка$extenion
Thomas Kekeisen

2

Ви можете це написати

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

Вони повернуть поточний елемент масиву, якщо не використовувався раніше.


Привіт, прохання перевірити, перш ніж погіршити його. Це працює, я використовував його в своєму коді багато разів. За допомогою цієї функції ви можете отримати лише ім'я файлу, якщо ім'я файлу - "xyz.jpg". Він може не працювати з іменами файлів, що містять у ньому весь шлях.
Jitendra Pawar

Це також не працює належним чином, якщо в ім’я файлу є кілька крапок, наприклад, "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.