Lihat kode:
var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc
function getFileExtension(filename) {
/*TODO*/
}
javascript
file-extension
Sergio del Amo
sumber
sumber
return filename.substring(0,1) === '.' ? '' : filename.split('.').slice(1).pop() || '';
Ini menangani.file
(Unix hidden, saya percaya) jenis file juga. Itu jika Anda ingin menyimpannya sebagai one-liner, yang sedikit berantakan menurut selera saya.Sederhanakan :)
Edit:
Ini adalah solusi non-regex lain yang saya yakin lebih efisien:
Ada beberapa kasus sudut yang lebih baik ditangani oleh jawaban VisioN di bawah ini, terutama file tanpa ekstensi (
.htaccess
termasuk dll).Ini sangat berkinerja, dan menangani kasus sudut dengan cara yang bisa dibilang lebih baik dengan mengembalikan
""
bukan string penuh ketika tidak ada titik atau tidak ada string sebelum titik. Ini solusi yang dibuat dengan sangat baik, meskipun sulit untuk dibaca. Tempelkan di lib pembantu Anda dan gunakan saja.Edit Lama:
Implementasi yang lebih aman jika Anda akan menjalankan file tanpa ekstensi, atau file tersembunyi tanpa ekstensi (lihat komentar VisioN untuk jawaban Tom di atas) akan menjadi sesuatu di sepanjang baris ini
Jika
a.length
satu, itu adalah file yang terlihat tanpa ekstensi yaitu. mengajukanJika
a[0] === ""
dana.length === 2
itu adalah file tersembunyi yaitu tanpa ekstensi. .htaccessSemoga ini bisa membantu menyelesaikan masalah dengan kasus yang sedikit lebih kompleks. Dalam hal kinerja, saya percaya solusi ini sedikit lebih lambat daripada regex di sebagian besar browser. Namun, untuk tujuan paling umum kode ini harus dapat digunakan dengan sempurna.
sumber
filename
sebenarnya tidak memiliki ekstensi? Bukankah ini hanya mengembalikan nama file dasar, yang akan menjadi agak buruk?Solusi berikut ini cepat dan cukup pendek untuk digunakan dalam operasi massal dan menghemat byte tambahan:
Berikut ini adalah satu lagi solusi universal non-regexp:
Keduanya berfungsi dengan benar dengan nama yang tidak memiliki ekstensi (mis. Myfile ) atau dimulai dengan
.
titik (misalnya .htaccess ):Jika Anda peduli dengan kecepatannya, Anda dapat menjalankan tolok ukur dan memeriksa apakah solusi yang disediakan adalah yang tercepat, sedangkan solusi singkatnya sangat cepat:
Cara kerja yang singkat:
String.lastIndexOf
Metode mengembalikan posisi terakhir dari substring (yaitu"."
) dalam string yang diberikan (yaitufname
). Jika substring tidak ditemukan metode akan dikembalikan-1
.-1
dan0
, yang masing-masing merujuk pada nama tanpa ekstensi (misalnya"name"
) dan nama yang dimulai dengan titik (misalnya".htaccess"
).>>>
) jika digunakan dengan nol memengaruhi angka negatif yang mentransformasikan-1
ke4294967295
dan-2
menjadi4294967294
, yang berguna untuk mempertahankan nama file tidak berubah dalam case edge (semacam trik di sini).String.prototype.slice
mengekstrak bagian nama file dari posisi yang dihitung seperti yang dijelaskan. Jika nomor posisi lebih dari panjang metode string kembali""
.Jika Anda menginginkan solusi yang lebih jelas yang akan bekerja dengan cara yang sama (ditambah dengan dukungan ekstra dari path lengkap), periksa versi lanjutan berikut. Solusi ini akan lebih lambat dari one-liners sebelumnya tetapi lebih mudah dipahami.
Ketiga varian harus bekerja di browser web apa pun di sisi klien dan dapat digunakan dalam kode NodeJS sisi server juga.
sumber
Diuji dengan
Juga
sumber
sumber
sumber
sumber
sumber
Kode
Uji
Perhatikan bahwa jika tidak ada kueri, fragmen mungkin masih ada.
JSLint
0 Peringatan.
sumber
Cepat dan berfungsi dengan benar dengan jalur
Beberapa tepi kasus
Solusi menggunakan split lambat dan solusi dengan lastIndexOf tidak menangani kasus tepi.
sumber
.exec()
. Kode Anda akan lebih baik(filename.match(/[^\\/]\.([^\\/.]+)$/) || [null]).pop()
.Saya hanya ingin membagikan ini.
walaupun ini memiliki kejatuhan bahwa file tanpa ekstensi akan mengembalikan string terakhir. tetapi jika Anda melakukannya, ini akan memperbaiki semua hal:
sumber
slice
metode mengacu pada array daripada string. Untuk stringsubstr
atausubstring
akan bekerja.String.prototype.slice
dan jugaArray.prototype.slice
jadi itu agak cara kerja agak metodeSaya yakin seseorang dapat, dan akan, meminimalkan dan / atau mengoptimalkan kode saya di masa depan. Tetapi, pada saat ini , saya yakin 200% bahwa kode saya berfungsi dalam setiap situasi unik (misalnya hanya dengan nama file saja , dengan relatif , relatif-root , dan URL absolut , dengan tag fragmen
#
, dengan string kueri?
, dan apa pun selain itu Anda dapat memutuskan untuk melemparnya), tanpa cacat, dan dengan presisi titik-pin.Sebagai bukti, kunjungi: https://projects.jamesandersonjr.com/web/js_projects/get_file_extension_test.php
Inilah JSFiddle: https://jsfiddle.net/JamesAndersonJr/ffcdd5z3/
Bukan untuk terlalu percaya diri, atau meniup trompet saya sendiri, tetapi saya belum melihat adanya blok kode untuk tugas ini (menemukan ekstensi file yang 'benar' , di tengah-tengah baterai
function
argumen input yang berbeda ) yang berfungsi sebaik ini.Catatan: Sesuai desain, jika ekstensi file tidak ada untuk string input yang diberikan, itu hanya mengembalikan string kosong
""
, bukan kesalahan, atau pesan kesalahan.Catatan (2): Jika Anda menyukai kode saya, pastikan untuk menambahkannya ke perpustakaan js Anda, dan / atau repo, karena saya bekerja keras untuk menyempurnakannya, dan akan sangat disayangkan untuk sia-sia. Jadi, tanpa basa-basi lagi, ini dia:
Nikmati! Anda cukup diterima!:
sumber
sumber
Jika Anda berurusan dengan url web, Anda dapat menggunakan:
Demo: https://jsfiddle.net/squadjot/q5ard4fj/
sumber
Coba ini:
sumber
sunting: Anehnya (atau mungkin tidak)
$1
argumen kedua pada metode ganti tampaknya tidak berfungsi ... Maaf.sumber
Saya baru menyadari bahwa tidak cukup untuk memberi komentar pada jawaban p4bl0, meskipun jawaban Tom jelas memecahkan masalah:
sumber
Untuk sebagian besar aplikasi, skrip sederhana seperti
akan bekerja dengan baik (seperti yang disediakan oleh Tom). Namun ini bukan bukti bodoh. Ini tidak berfungsi jika nama file berikut disediakan:
Mungkin sedikit berlebihan tetapi saya menyarankan menggunakan url parser seperti ini untuk menghindari kegagalan karena nama file yang tidak dapat diprediksi.
Dengan menggunakan fungsi khusus itu, Anda bisa mendapatkan nama file seperti ini:
Ini akan menampilkan "image.jpg" tanpa url vars. Maka Anda bebas untuk mengambil ekstensi file.
sumber
sumber
//pemakaian
ekstensi ('file.jpeg')
selalu mengembalikan kas ekstensi yang lebih rendah sehingga Anda dapat memeriksanya pada perubahan bidang berfungsi untuk:
file.JpEg
file (tidak ada ekstensi)
mengajukan. (noextension)
sumber
Jika Anda mencari ekstensi tertentu dan mengetahui panjangnya, Anda dapat menggunakan substr :
Referensi JavaScript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr
sumber
Saya banyak bulan terlambat ke pesta tetapi untuk kesederhanaan saya menggunakan sesuatu seperti ini
sumber
Ada fungsi perpustakaan standar untuk ini dalam
path
modul:Keluaran:
Jadi, jika Anda hanya menginginkan format:
Jika tidak ada ekstensi, maka fungsi tersebut akan mengembalikan string kosong:
Jika Anda menggunakan Node, berarti
path
sudah built-in. Jika Anda menargetkan browser, maka Webpack akan membundelpath
implementasi untuk Anda. Jika Anda menargetkan browser tanpa Webpack, maka Anda dapat menyertakan path-browserify secara manual.Tidak ada alasan untuk melakukan pemisahan string atau regex.
sumber
"one-liner" untuk mendapatkan nama file dan ekstensi menggunakan
reduce
dan merusak array :dengan lekukan yang lebih baik:
sumber
Solusi satu baris yang juga akan menghitung params kueri dan karakter apa pun di url.
sumber
page.html#fragment
), Ini akan mengembalikan ekstensi file dan fragmen.Solusi sederhana ini
Tes
sumber
Jawaban Wallacer bagus, tetapi diperlukan satu pemeriksaan lagi.
Jika file tidak memiliki ekstensi, itu akan menggunakan nama file sebagai ekstensi yang tidak baik.
Coba yang ini:
sumber
Jangan lupa bahwa beberapa file tidak memiliki ekstensi, jadi:
sumber
sumber
sumber