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.