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.

Mostafa Elkady
sumber

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
Czechnology
sumber
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.

Gordon
sumber
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

yaart
sumber
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.

caiosm1005
sumber
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

anydasa
sumber
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));
api
sumber
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.

Rohan Khude
sumber
7

Tidak perlu menulis banyak kode. Bahkan itu bisa dilakukan hanya dengan satu baris kode. Lihat di sini

Di bawah ini adalah satu kode baris yang hanya mengembalikan nama file dan menghapus nama ekstensi:

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

Itu akan mencetak

logo

Sumber: Hapus ekstensi dan hanya kembalikan nama file dalam PHP

Faruque Ahamed Mollick
sumber
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"
NSINE
sumber
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.
Ho Vng Tgtt
sumber
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.

Jitendra Pawar
sumber
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
mariovials
sumber
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, "."));

pengguna2047861
sumber
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"
Ghanshyam Gohel
sumber
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");
?>
shaz3e
sumber
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
Dan Bray
sumber
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"
Vincenzo Ruffa
sumber