Bagaimana cara saya mendapatkan ekstensi file dalam PHP?

723

Ini adalah pertanyaan yang dapat Anda baca di mana saja di web dengan berbagai jawaban:

$ext = end(explode('.', $filename));
$ext = substr(strrchr($filename, '.'), 1);
$ext = substr($filename, strrpos($filename, '.') + 1);
$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $filename);

$exts = split("[/\\.]", $filename);
$n    = count($exts)-1;
$ext  = $exts[$n];

dll.

Namun, selalu ada "cara terbaik" dan itu harus di Stack Overflow.

e-satis
sumber
15
Sumber pertanyaan dan jawaban: cowburn.info/2008/01/13/get-file-extension-comparison
salathe
5
Satu lagi cara untuk mendapatkan ekst adalahstrrchr($filename, '.');
verybadbug

Jawaban:

1776

Orang-orang dari bahasa skrip lain selalu berpikir bahwa bahasa mereka lebih baik karena mereka memiliki fungsi bawaan untuk melakukan itu dan bukan PHP (saya melihat Pythonistas sekarang :-)).

Sebenarnya, memang ada, tetapi sedikit orang yang mengetahuinya. Bertemu pathinfo():

$ext = pathinfo($filename, PATHINFO_EXTENSION);

Ini cepat dan terintegrasi. pathinfo()dapat memberi Anda informasi lain, seperti jalur kanonik, tergantung pada konstanta yang Anda berikan.

Ingat bahwa jika Anda ingin dapat berurusan dengan karakter non ASCII, Anda harus mengatur lokal terlebih dahulu. MISALNYA:

setlocale(LC_ALL,'en_US.UTF-8');

Juga, perhatikan ini tidak mempertimbangkan konten file atau tipe mime, Anda hanya mendapatkan ekstensi. Tapi itu yang kau minta.

Terakhir, perhatikan bahwa ini hanya berfungsi untuk path file, bukan path sumber URL, yang dicakup menggunakan PARSE_URL.

Nikmati

e-satis
sumber
62
Saya berharap saya bisa memilih ini dua kali. Saya tidak dapat memberi tahu Anda berapa banyak kode yang dapat saya ganti menggunakan pathinfo
Mark Biek
8
Saya juga. Karena itulah saya taruh di sini!
e-satis
7
Whaddaya tahu, ternyata ada cara terbaik.
Ben
19
@khizaransari Anda harus mencari penyedia hosting lain, yang Anda dapatkan itu bodoh. Sungguh, aku bersungguh-sungguh. Tidak ada alasan apa pun untuk menonaktifkan fungsi ini. Katakan itu pada mereka. Sebagai solusinya: function get_ext($fname){ return substr($fname, strrpos($fname, ".") + 1); }Pastikan file memiliki ekstensi, itu dapat melakukan apa pun ketika Anda melewati jalan sebagai argumen!
Luc
12
ide saya tentang PHP dibandingkan dengan python berubah sepenuhnya sekarang setelah saya tahu tentang fungsi ini: O
Tommaso Barbugli
166

pathinfo()

$path_info = pathinfo('/foo/bar/baz.bill');

echo $path_info['extension']; // "bill"
Adam Wright
sumber
14
Sejak PHP 5.5 ->echo pathinfo('/foo/bar/baz.bill')['extension'];
Salman A
1
Ini bahkan berfungsi pada level ini (Twitter json): $ ext = pathinfo ($ result-> extended_entities-> media [0] -> video_info-> varian [1] -> url, PATHINFO_EXTENSION);
KJS
101

URL contoh: http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ

A) Jangan gunakan yang disarankan tidak amanPATHINFO :

pathinfo($url)['dirname']   🡺 'http://example.com/myfolder'
pathinfo($url)['basename']  🡺 'sympony.mp3?a=1&b=2#XYZ'         // <------- BAD !!
pathinfo($url)['extension'] 🡺 'mp3?a=1&b=2#XYZ'                 // <------- BAD !!
pathinfo($url)['filename']  🡺 'sympony'

B) Gunakan PARSE_URL :

parse_url($url)['scheme']   🡺 'http'
parse_url($url)['host']     🡺 'example.com'
parse_url($url)['path']     🡺 '/myfolder/sympony.mp3'
parse_url($url)['query']    🡺 'aa=1&bb=2'
parse_url($url)['fragment'] 🡺 'XYZ'

BONUS: Lihat semua contoh PHP asli

T.Todua
sumber
3
Jawaban ini mencakup semuanya, mis. file seperti foo_folder/foo-file.jpg?1345838509akan gagal total hanya pathinfo, thanx
1
Tidak sepenuhnya sesuai topik, tapi itu memang memecahkan masalah saya!
Howie
7
Jangan lupakan apa pun! parse_urladalah untuk URL dan pathinfountuk jalur file.
Nabi KAZ
1
Apa maksudmu "lupakan info jalur"? Anda menggunakannya dalam solusi!
Autumn Leonard
1
@AutumnLeonard Dia tidak, dia hanya menunjukkan perbedaan antara pathinfo dan parse_url.
59

Ada juga SplFileInfo:

$file = new SplFileInfo($path);
$ext  = $file->getExtension();

Seringkali Anda dapat menulis kode yang lebih baik jika Anda melewatkan objek semacam itu di sekitar bukannya string. Kode Anda lebih banyak berbicara. Sejak PHP 5.4 ini adalah one-liner:

$ext  = (new SplFileInfo($path))->getExtension();
hakre
sumber
Fantastis, Objeknya selalu turun :)
Christopher Chase
2
Perlu diketahui bahwa ->getExtension()tersedia di SplFileInfo sejak PHP 5.3.6.
matthias
1
@matthias: Perlu diketahui bahwa SPL dapat dinonaktifkan dalam versi PHP yang ada sebelum rilis PHP 5.3.0. Jika Anda masih tidak menjalankan PHP 5.3 tetapi 5.2 atau lebih rendah, jawaban ini kemungkinan besar tidak cocok untuk kode stabil. Kalau tidak, Anda dapat menstabilkan kode Anda dengan mengharuskan versi PHP tertentu dan jika tidak, bail out.
hakre
@ hakre Meskipun Anda benar dalam mengatakannya "dapat dinonaktifkan di versi sebelum 5.3.0", ekstensi SPL tetap dikompilasi secara default pada PHP 5.0.0. Jadi komentar ini masuk akal bagi orang yang dipaksa untuk menggunakan PHP 5.2 atau lebih rendah dan tidak ingin mengundurkan diri menggunakan kelas SPL tertentu.
matthias
ya, hanya versi mati bulu :)
hakre
23

Respons E-satis adalah cara yang benar untuk menentukan ekstensi file.

Atau, alih-alih mengandalkan ekstensi file, Anda bisa menggunakan fileinfo untuk menentukan jenis file MIME.

Berikut adalah contoh sederhana dari pemrosesan gambar yang diunggah oleh pengguna:

// Code assumes necessary extensions are installed and a successful file upload has already occurred

// Create a FileInfo object
$finfo = new FileInfo(null, '/path/to/magic/file');

// Determine the MIME type of the uploaded file
switch ($finfo->file($_FILES['image']['tmp_name'], FILEINFO_MIME)) {        
    case 'image/jpg':
        $im = imagecreatefromjpeg($_FILES['image']['tmp_name']);
    break;

    case 'image/png':
        $im = imagecreatefrompng($_FILES['image']['tmp_name']);
    break;

    case 'image/gif':
        $im = imagecreatefromgif($_FILES['image']['tmp_name']);
    break;
}
Toksigen
sumber
1
Ini adalah jawaban yang HANYA benar. Saya tidak mengerti mengapa orang memilih orang lain. Ya, pendekatan ini menuntut lebih banyak upaya dari pengembang tetapi ini meningkatkan kinerja (meskipun sedikit, tetapi memang demikian). Silakan lihat ini .
Bhavik Shah
2
@ Bhavik: Dalam beberapa kasus kita mungkin hanya memerlukan ekstensi file, mereka tentang jenis cek mime. Tetapi pertanyaan sebenarnya adalah tentang ekstensi file, bukan tipe file. Jadi ini BUKAN jawaban terbaik untuk pertanyaan ini. (belum jawaban)
Sasi varna kumar
switch ini membutuhkan tanda kurung tambahan
rsb2097
16

Selama tidak mengandung jalur Anda juga bisa menggunakan:

array_pop(explode('.', $fname))

Di mana $fnameadalah nama file, misalnya: my_picture.jpg. Dan hasilnya adalah:jpg

Anonim
sumber
@Kenapa ini memiliki 3 downvotes? ini memberikan hasil yang tepat. Tolong jelaskan
railsbox
Itu tidak salah, itu hanya bukan cara terbaik untuk melakukannya. Terpilih untuk sedikit keseimbangan.
Ini adalah cara terbaik, ketika Anda membutuhkan ekstensi nyata dan nama file mungkin memiliki beberapa. Di dalamnya, seperti foto yang diunggah pengguna dalam kasus saya.
Rauli Rajande
2
Ini gagal jika nama file tidak memiliki ekstensi. Coba lewati "myfile" dan itu akan mengembalikan "myfile". Nilai kembali yang benar adalah string kosong sebagai ekstensi dalam kasus penggunaan ini.
pmont
Ini salah dalam array_pop () yang akan mengirimkan pemberitahuan karena mengambil pointer sebagai parameternya.
Jurchiks
12

1) Jika Anda menggunakan (PHP 5> = 5.3.6) Anda dapat menggunakan SplFileInfo :: getExtension - Mendapat ekstensi file

Kode contoh

<?php

$info = new SplFileInfo('test.png');
var_dump($info->getExtension());

$info = new SplFileInfo('test.tar.gz');
var_dump($info->getExtension());

?>

Ini akan menampilkan

string(3) "png"
string(2) "gz"

2) Cara lain untuk mendapatkan ekstensi jika Anda menggunakan (PHP 4> = 4.0.3, PHP 5) adalah pathinfo

Kode contoh

<?php

$ext = pathinfo('test.png', PATHINFO_EXTENSION);
var_dump($ext);

$ext = pathinfo('test.tar.gz', PATHINFO_EXTENSION);
var_dump($ext);

?>

Ini akan menampilkan

string(3) "png"
string(2) "gz"

// EDIT: menghapus braket

Subodh Ghulaxe
sumber
12

Terkadang bermanfaat untuk tidak menggunakan pathinfo($path, PATHINFO_EXTENSION). Sebagai contoh:

$path = '/path/to/file.tar.gz';

echo ltrim(strstr($path, '.'), '.'); // tar.gz
echo pathinfo($path, PATHINFO_EXTENSION); // gz

Perhatikan juga bahwa pathinfogagal menangani beberapa karakter non-ASCII (biasanya itu hanya menekannya dari output). Dalam ekstensi yang biasanya tidak menjadi masalah, tetapi tidak ada salahnya untuk menyadari peringatan itu.

Alix Axel
sumber
6
@ e-satis: Menurut Wikipedia, ini adalah dua ekstensi: Sistem file mirip UNIX menggunakan model yang berbeda tanpa metadata ekstensi terpisah. Titik karakter hanya tokoh lain dalam nama file utama, dan nama file dapat memiliki beberapa ekstensi, biasanya mewakili transformasi bersarang, seperti files.tar.gz .
Alix Axel
1
Dan jika kita memiliki titik dalam nama produk? Mis:test.19-02-2014.jpeg
Mario Radomanana
Ini akan gagal dengan /root/my.folder/my.css ltrim(strrchr($PATH, '.'),'.')bekerja seperti pathinfo, tetapi tanpa tokenizing semuanya.
Ray Foss
8

Cara paling sederhana untuk mendapatkan ekstensi file dalam PHP adalah dengan menggunakan fungsi pathinfo bawaan PHP .

$file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION);
echo ($file_ext); // The output should be the extension of the file e.g., png, gif, or html
Shahbaz
sumber
8

Anda juga dapat mencoba ini (berfungsi pada PHP 5. * dan 7):

$info = new SplFileInfo('test.zip');
echo $info->getExtension(); // ----- Output -----> zip

Kiat: ini mengembalikan string kosong jika file tidak memiliki ekstensi

pooya_sabramooz
sumber
7

Maaf ... "Pertanyaan Pendek; Tapi BUKAN Jawaban Pendek"

Contoh 1 untuk PATH

$path = "/home/ali/public_html/wp-content/themes/chicken/css/base.min.css";
$name = pathinfo($path, PATHINFO_FILENAME);
$ext  = pathinfo($path, PATHINFO_EXTENSION);
printf('<hr> Name: %s <br> Extension: %s', $name, $ext);

Contoh 2 untuk URL

$url = "//www.example.com/dir/file.bak.php?Something+is+wrong=hello";
$url = parse_url($url);
$name = pathinfo($url['path'], PATHINFO_FILENAME);
$ext  = pathinfo($url['path'], PATHINFO_EXTENSION);
printf('<hr> Name: %s <br> Extension: %s', $name, $ext);

Output dari contoh 1:

Name: base.min
Extension: css

Output dari contoh 2:

Name: file.bak
Extension: php

Referensi

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

  2. https://www.php.net/manual/en/function.realpath.php

  3. https://www.php.net/manual/en/function.parse-url.php

Ali
sumber
6

Perbaikan cepat akan menjadi sesuatu seperti ini.

// Exploding the file based on the . operator
$file_ext = explode('.', $filename);

// Count taken (if more than one . exist; files like abc.fff.2013.pdf
$file_ext_count = count($file_ext);

// Minus 1 to make the offset correct
$cnt = $file_ext_count - 1;

// The variable will have a value pdf as per the sample file name mentioned above.
$file_extension = $file_ext[$cnt];
versi 2
sumber
Mengapa tidak hanya menggunakan fungsi bawaan PHP untuk tujuan php.net/manual/en/function.pathinfo.php alih-alih menggunakan kode panjang
Shahbaz
1
Selain poin Shahbaz, Anda juga bisa $file_ext = end(explode('.', $filename));melakukan apa saja dalam jawaban ini dalam satu baris, bukan empat.
tvanc
@ Amelia Bagaimana jika Anda punya .tar.gz. Ini tidak akan berfungsi, jadi jika Anda perlu menggunakan ekstensi penuh seperti ltrim(strstr($filename, '.'), '.');untuk mendapatkan ekstensi penuh bukannya tidak tepat gz.
Marin Sagovac
6

Berikut ini sebuah contoh. Misalkan $ nama file adalah "example.txt",

$ext = substr($filename, strrpos($filename, '.', -1), strlen($filename));

Jadi $ ext akan menjadi ".txt".

GI Joe
sumber
6

pathinfo adalah sebuah array. Kami dapat memeriksa nama direktori, nama file, ekstensi , dll .:

$path_parts = pathinfo('test.png');

echo $path_parts['extension'], "\n";
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['filename'], "\n";
Arshid KV
sumber
5
substr($path, strrpos($path, '.') + 1);
Kurt Zhong
sumber
1
Ini akan gagal dengan /root/my.folder/my.css
Ray Foss
1
Ini harus bekerja dengan benar: substr ($ path, strrpos ($ path, '.') + 1); Catatan: metode ini lebih cepat daripada solusi lain di atas. Coba patokan menggunakan skrip kami sendiri.
Abbas
4

Anda juga dapat mencoba ini:

 pathinfo(basename($_FILES["fileToUpload"]["name"]), PATHINFO_EXTENSION)
senyum 22121
sumber
4
ltrim(strstr($file_url, '.'), '.')

ini adalah cara terbaik jika Anda memiliki nama file seperti name.name.name.ext (jelek, tetapi kadang-kadang terjadi

Anjani Barnwal
sumber
3

Ini akan bekerja

$ext = pathinfo($filename, PATHINFO_EXTENSION);
Deepika Patel
sumber
Ini sudah dijawab jauh lebih baik oleh Subodh pada bulan Agustus.
Nisse Engström
3

Saya menemukan bahwa pathinfo()dan SplFileInfosolusi berfungsi dengan baik untuk file standar pada sistem file lokal, tetapi Anda dapat mengalami kesulitan jika Anda bekerja dengan file jarak jauh karena URL untuk gambar yang valid mungkin memiliki #(pengidentifikasi fragmen) dan / atau ?(parameter kueri) di akhir URL, yang akan diperlakukan oleh kedua solusi tersebut (salah) sebagai bagian dari ekstensi file.

Saya menemukan ini adalah cara yang dapat diandalkan untuk digunakan pathinfo()pada URL setelah pertama menguraikannya untuk menghapus kekacauan yang tidak perlu setelah ekstensi file:

$url_components = parse_url($url); // First parse the URL
$url_path = $url_components['path']; // Then get the path component
$ext = pathinfo($url_path, PATHINFO_EXTENSION); // Then use pathinfo()
Jonathan Ellis
sumber
3

Menggunakan substr($path, strrpos($path,'.')+1); . Ini adalah metode tercepat dari semua perbandingan.

@Kurt Zhong sudah menjawab.

Mari kita periksa hasil perbandingannya di sini: https://eval.in/661574

Abbas
sumber
2

Anda bisa mendapatkan semua ekstensi file di folder tertentu dan melakukan operasi dengan ekstensi file tertentu:

<?php
    $files = glob("abc/*.*"); // abc is the folder all files inside folder
    //print_r($files);
    //echo count($files);
    for($i=0; $i<count($files); $i++):
         $extension = pathinfo($files[$i], PATHINFO_EXTENSION);
         $ext[] = $extension;
         // Do operation for particular extension type
         if($extension=='html'){
             // Do operation
         }
    endfor;
    print_r($ext);
?>
Samir Karmacharya
sumber
2

Kerjakan dengan cepat.

Panggilan tingkat rendah harus sangat cepat, jadi saya pikir itu layak untuk diteliti. Saya mencoba beberapa metode (dengan berbagai panjang tali, panjang ekstensi, beberapa kali masing-masing berjalan), berikut beberapa yang masuk akal:

function method1($s) {return preg_replace("/.*\./","",$s);} // edge case problem
function method2($s) {preg_match("/\.([^\.]+)$/",$s,$a);return $a[1];}
function method3($s) {$n = strrpos($s,"."); if($n===false) return "";return substr($s,$n+1);}
function method4($s) {$a = explode(".",$s);$n = count($a); if($n==1) return "";return $a[$n-1];}
function method5($s) {return pathinfo($s, PATHINFO_EXTENSION);}

Hasilnya tidak terlalu mengejutkan. Miskin pathinfo(sejauh ini!) Adalah yang paling lambat (sepertinya dia mencoba menguraikan semuanya dan kemudian menjatuhkan semua bagian yang tidak perlu) - dan method3()(strrpos) adalah yang tercepat, sejauh ini:

Original filename was: something.that.contains.dots.txt
Running 50 passes with 10000 iterations each
Minimum of measured times per pass:

    Method 1:   312.6 mike  (response: txt) // preg_replace
    Method 2:   472.9 mike  (response: txt) // preg_match
    Method 3:   167.8 mike  (response: txt) // strrpos
    Method 4:   340.3 mike  (response: txt) // explode
    Method 5:  2311.1 mike  (response: txt) // pathinfo  <--------- poor fella

CATATAN: metode pertama memiliki efek samping: metode ini mengembalikan seluruh nama ketika tidak ada ekstensi. Tentunya tidak masuk akal untuk mengukurnya dengan kekuatan tambahan untuk menghindari perilaku ini.

Kesimpulan

Ini terlihat seperti Jalan Samurai:

function fileExtension($s) {
    $n = strrpos($s,".");
    return ($n===false) ? "" : substr($s,$n+1);
}
dkellner
sumber
1

Jika Anda mencari kecepatan (seperti di router), Anda mungkin tidak ingin tokenize semuanya. Banyak jawaban lain akan gagal/root/my.folder/my.css

ltrim(strrchr($PATH, '.'),'.');
Ray Foss
sumber
1

Meskipun "cara terbaik" masih bisa diperdebatkan, saya percaya ini adalah cara terbaik karena beberapa alasan:

function getExt($path)
{
    $basename = basename($path);
    return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
  1. Ini berfungsi dengan beberapa bagian ke ekstensi, misalnya tar.gz
  2. Kode pendek dan efisien
  3. Ia bekerja dengan nama file dan path lengkap
Dan Bray
sumber
1

IMO, ini adalah cara terbaik jika Anda memiliki nama file seperti name.name.name.ext (jelek, tapi kadang-kadang terjadi):

$ext     = explode('.', $filename); // Explode the string
$ext_len = count($ext) - 1; // Count the array -1 (because count() starts from 1)
$my_ext  = $ext[$ext_len]; // Get the last entry of the array

echo $my_ext;
Tommy89
sumber
1

$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $fileName);

preg_replace pendekatan yang kami gunakan pencarian ekspresi reguler dan ganti. Dalam fungsi preg_replace, parameter pertama adalah pola pencarian, parameter kedua $ 1 adalah referensi untuk apa pun yang cocok dengan yang pertama (. *) Dan parameter ketiga adalah nama file.

Cara lain, kita juga dapat menggunakan strrpos untuk menemukan posisi kemunculan terakhir dari '.' dalam nama file dan naikkan posisi itu dengan 1 sehingga akan meledak string dari (.)

$ext = substr($fileName, strrpos($fileName, '.') + 1);

Sai Kiran Sangam
sumber
0

Sebenarnya, saya sedang mencari itu.

<?php

$url = 'http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ';
$tmp = @parse_url($url)['path'];
$ext = pathinfo($tmp, PATHINFO_EXTENSION);

var_dump($ext);
Fred
sumber
-1

Menggunakan

str_replace('.', '', strrchr($file_name, '.'))

untuk pengambilan ekstensi cepat (jika Anda tahu pasti nama file Anda memilikinya).

AlexB
sumber