PHP, Pobierz nazwę pliku bez rozszerzenia pliku

Mam ten kod 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]);
    }
}

Jeśli mam plik o nazwie my.zip, funkcja zwraca .zip.

Chcę zrobić odwrotnie, chcę, aby funkcja zwracała my bez rozszerzenia.

Plik jest tylko łańcuchem znaków w zmiennej.

Author: Eric Leschinski, 2010-02-02

17 answers

Nie ma takiej potrzeby. Zobacz też pathinfo(), daje wam wszystkie składniki waszej ścieżki.

Przykład z podręcznika:

$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

Wyjście kodu:

/www/htdocs
index.html
html
index

I alternatywnie można uzyskać tylko niektóre części, takie jak:

echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html
 280
Author: Czechnology,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-30 18:39:41

Jako alternatywa dla pathinfo(), możesz użyć

Przykład z podręcznika 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"

Musisz znać rozszerzenie, aby je wcześniej usunąć.

Jednak, ponieważ twoje pytanie sugeruje, że masz potrzebę uzyskania rozszerzenia i nazwy bazowej, zagłosowałbym na odpowiedź Pekki jako najbardziej przydatną, ponieważ da ci ona wszelkie potrzebne informacje o ścieżce i Plik z jedną natywną funkcją.

 182
Author: Gordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:54

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

pathinfo($path, PATHINFO_FILENAME);

Prosty test funkcjonalny: http://ideone.com/POhIDC

 45
Author: yckart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-06 08:31:37

Innym podejściem jest użycie wyrażeń regularnych.

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

Usuwa z ostatniego okresu . aż do końca łańcucha.

 11
Author: caiosm1005,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 02:13:06

Jeśli rozszerzenie nie jest znane, użyj tego rozwiązania

 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

 9
Author: anydasa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-24 21:46:24

@ Gordon basename będzie działać dobrze, jeśli znasz rozszerzenie, jeśli nie możesz użyć explode:

$filename = end(explode(".", $file));
 8
Author: fire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 14:13:40

Prawie wszystkie powyższe rozwiązania mają pokazaną nazwę pliku ze zmiennej $path

Poniżej urywek pobierze bieżącą wykonaną nazwę pliku bez rozszerzenia

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

Explanation

$_SERVER ['SCRIPT_NAME'] zawiera ścieżkę do bieżącego skryptu.

 6
Author: Rohan Khude,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-12 06:07:41

@fire incase nazwa pliku używa kropek, możesz dostać złe wyjście. Użyłbym metody @ Gordon, ale get the extension too, więc funkcja basename działa ze wszystkimi rozszerzeniami, jak to:

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

$file = basename($path, ".".$ext); // $file is set to "index"
 4
Author: NSINE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-02 12:15:32

W moim przypadku używam poniżej. Nie obchodzi mnie, jaka jest jego rozbudowa. :D myślę, że to ci pomoże

$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
Author: Hoàng Vũ Tgtt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-13 19:46:39

Nie ma potrzeby, aby pisać dużo kodu. Nawet można to zrobić tylko za pomocą jednej linii kodu. Zobacz TUTAJ

Poniżej znajduje się kod w jednej linii, który zwraca tylko nazwę pliku i usuwa nazwę rozszerzenia:

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

Wydrukuje

logo

Źródło: Usuń rozszerzenie i zwróć tylko nazwę pliku w PHP

 3
Author: Faruque Ahamed Mollick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-10 19:12:15

Krótki

echo pathinfo(__FILE__)['filename']; // since php 5.2
 2
Author: mariovials,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-28 12:35:38

Nazwa pliku bez rozszerzenia, gdy nie znasz tego rozszerzenia:

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

 1
Author: user2047861,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-27 07:37:00

Jeśli nie wiesz, które rozszerzenie masz, możesz spróbować tego:

$ext = strtolower(substr('yourFileName.ext', strrpos('yourFileName.ext', '.') + 1));
echo basename('yourFileName.ext','.'.$ext); // output: "youFileName" only

Praca ze wszystkimi możliwościami:

image.jpg // output: "image"
filename.image.png // output: "filename.image"
index.php // output: "index"
 1
Author: Ghanshyam Gohel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-25 17:53:38

Możesz to napisać

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

Zwróci bieżący element tablicy, jeśli nie zostanie użyty wcześniej.

 1
Author: Jitendra Pawar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-06 11:59:33

Twoja odpowiedź znajduje się poniżej idealne rozwiązanie do ukrycia rozszerzenia pliku w php.

<?php
    $path = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    echo basename($path, ".php");
?>
 1
Author: shaz3e,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-21 13:35:51

Zwraca tylko nazwę pliku bez rozszerzenia w 1 wierszu:

$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"
 0
Author: Vincenzo Ruffa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-27 15:20:22

Istniejące rozwiązania zawodzą, gdy istnieje wiele części rozszerzenia. Poniższa funkcja działa dla wielu części, pełnej ścieżki lub tylko nazwy pliku:

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
Author: Dan Bray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 15:21:37