PHP, dapatkan nama file tanpa ekstensi file


205

Saya punya kode PHP ini:

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

Jika saya memiliki file bernama my.zip, fungsi ini kembali .zip.

Saya ingin melakukan yang sebaliknya, saya ingin fungsi kembali mytanpa ekstensi.

File ini hanya sebuah string dalam sebuah variabel.


Jawaban:


398

Tidak perlu untuk semua itu. Lihat pathinfo () , ini memberi Anda semua komponen jalur Anda.

Contoh dari manual:

$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

Keluaran kode:

/www/htdocs
index.html
html
index

Atau sebagai alternatif Anda hanya bisa mendapatkan bagian-bagian tertentu seperti:

echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html

3
Mengapa ini diturunkan? Jawabannya benar sekali. pathinfo beroperasi pada string, jadi tidak masalah apakah file tersebut benar-benar ada di server atau tidak.
Gordon

13
Sangat disayangkan bahwa mereka menyebut nama "basename", karena mengembalikan nama file lengkap dengan ekstensi, bukan nama dasar.
Oscar

1
@Oscar itu adalah makna istilah yang paling banyak dipahami basename. Tidak salah nama.
nawfal

1
Ini sangat berguna, terutama ketika Anda tidak perlu tahu ekstensi file untuk mengekstraknya.
Vahid Amiri

Ini adalah solusi yang sangat elegan. Pujian. Ini harus ditandai sebagai jawaban yang benar.
Native Coder

199

Sebagai alternatif pathinfo(), Anda bisa menggunakannya

  • basename() - Mengembalikan nama file komponen path

Contoh dari manual 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"

Anda harus mengetahui ekstensi untuk menghapusnya terlebih dahulu.

Namun, karena pertanyaan Anda menunjukkan Anda perlu mendapatkan ekstensi dan nama dasarnya, saya akan memilih jawaban Pekka sebagai yang paling berguna, karena itu akan memberi Anda info apa pun yang Anda inginkan tentang jalur dan file dengan satu asli tunggal fungsi.


1
bagaimana jika saya tidak tahu tentang ekstensi file .. katakanlah jika path dinamis jenis file ekstensi bisa datang di dalamnya !! lalu apa ??
user889030

@ user889030 maka Anda memiliki skenario yang berbeda dari OP dan tidak menggunakan basename, tetapi pathinfoseperti yang ditunjukkan pada halaman.
Gordon

72

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

pathinfo($path, PATHINFO_FILENAME);

Tes fungsional sederhana: https://ideone.com/POhIDC


Ini akan mengembalikan nama file dengan ekstensi
user966939

2
@ user966939 Mhh, tidak dengan ekstensi basename;-)
yckart

Yah, bagaimanapun juga, dia meminta solusi TANPA ekstensi. ;)
user966939

2
@ user966939, Bung tidak ada ekstensi sama sekali. Ini PATHINFO_FILENAMEbukan PATHINFO_EXTENSION ....
Pacerier

20
Siapa pun yang memutuskan bahwa filenametidak memiliki perpanjangan sementara basenameharus memiliki beberapa kecenderungan sadis ...
Mark

12

Pendekatan lain adalah dengan menggunakan ekspresi reguler.

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

Ini menghapus dari periode terakhir .hingga akhir string.


Saya suka jawaban ini, sangat sederhana dan berfungsi ketika Anda tidak tahu ekstensi.
Relipse

Jauh lebih baik daripada menggunakan meledak, dan hanya menangkap bagian periode terakhir jika Anda menggunakan periode dalam nama file
Kiwizoom

7
Tidak , ini jauh lebih buruk. Hentikan regexing orang.
Pacerier

Terima kasih, dan komentar di atas berhasil. Tidak harus tahu ekstensi membuat ini lebih bermanfaat.
James Taylor

1
@ caiosm1005, Permukaan serangan segera meningkat karena sulit untuk alasan terhadap internal mesin regex. Misalnya, dalam kode di atas, tidak aneh jika ada beberapa input $fileNameyang dapat menyebabkan mesin berjalan dalam waktu yang eksponensial (atau lebih buruk). Dan dengan asumsi kita telah selesai membedah internal mesin regex spesifik ini dan secara teoritis membuktikannya kuat terhadap setiap nilai yang $fileNamemungkin, kode tersebut masih belum sewenang-wenang portabel ke platform lain yang memiliki implementasi lain dari mesin regex.
Pacerier

12

Jika ekstensi tidak diketahui, gunakan solusi ini

 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"

Fungsi PHP MAN pathinfo


Harap berikan like ke halaman manual php untuk pathinfo. Ini akan membantu OP membuat ShowFileExtensionmetode lebih baik dan akan memberikan bacaan tambahan bagi siapa pun yang mencoba menemukan jawaban ini. Juga sedikit deskripsi tidak akan tersesat ...
Michael Coxon

1
Saya telah menjawab pertanyaan ini dengan solusi yang sama, ~ 2 tahun sebelum Anda;)
yckart

@yckart benar tetapi ini memang memberikan banyak contoh dalam jawaban. Milik Anda memiliki manfaat tautan ke ideone.com tetapi situs tersebut dapat offline.
Adam Elsodaney

7

@Gordon basename akan berfungsi dengan baik jika Anda tahu ekstensi, jika Anda tidak dapat menggunakan meledak:

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

1
Tolong arahkan komentar ke saya dengan fungsi komentar di bawah jawaban saya. Fungsi yang paling tepat untuk ini adalah pathinfo, itulah sebabnya saya berikan basenamesebagai alternatif saja. Tidak perlu menemukan kembali pathinfodengan regex atau explode.
Gordon

4
@fire, Pembaruan Anda tidak masuk akal. end(explode(".", $file));memberi Anda ekstensi, bukan nama file.
Pacerier

7

Hampir semua solusi di atas menunjukkan mendapatkan nama file dari variabel $ path

Cuplikan di bawah ini akan mendapatkan nama file yang dieksekusi saat ini tanpa ekstensi

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

Penjelasan

$ _SERVER ['SCRIPT_NAME'] berisi path dari skrip saat ini.



4

@fire jika nama file menggunakan titik, Anda bisa mendapatkan output yang salah. Saya akan menggunakan metode @Gordon tetapi mendapatkan ekstensi juga, jadi fungsi basename berfungsi dengan semua ekstensi, seperti ini:

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

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

4

dalam kasus saya, saya gunakan di bawah ini. Saya tidak peduli apa perluasannya. : D saya pikir itu akan membantu Anda

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

Btw .: Anda memiliki salah ketik$extenion
Thomas Kekeisen

2

Anda bisa menulis ini

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

Ini akan mengembalikan elemen array saat ini, jika tidak digunakan sebelumnya.


Halo, Mohon periksa sebelum menurunkannya. Ini berfungsi, saya telah menggunakannya dalam kode saya berkali-kali. Dengan menggunakan fungsi ini Anda bisa mendapatkan hanya nama file Jika nama file Anda adalah "xyz.jpg". Mungkin tidak berfungsi dengan nama file yang berisi seluruh jalur di dalamnya.
Jitendra Pawar

Ini juga tidak berfungsi dengan benar jika nama file memiliki beberapa titik di dalamnya, mis. "Some.interesting.image.jpg"
ganzpopp

2

Pendek

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

baik. Tetapi jika saya memasukkan kode di atas b.phpdan saya dieksekusi a.phpmemiliki require('b.php'). Maka output akan bagaimana bbukannyaa
Rohan Khude

1

Nama file tanpa ekstensi file saat Anda tidak tahu ekstensi itu:

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


2
Bagaimana jika ekstensi itu mirip dengan .tar.gz?
Arda

1

Jika Anda tidak tahu ekstensi mana yang Anda miliki, maka Anda dapat mencoba ini:

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

Bekerja dengan semua kemungkinan:

image.jpg // output: "image"
filename.image.png // output: "filename.image"
index.php // output: "index"

1

Jawaban Anda di bawah solusi sempurna untuk menyembunyikan ekstensi file di php.

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

1

Solusi yang ada gagal ketika ada beberapa bagian ekstensi. Fungsi di bawah ini berfungsi untuk beberapa bagian, path lengkap atau hanya nama file:

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

Ini hanya mengembalikan nama file tanpa ekstensi dalam 1 baris:

$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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.