Saya mencari fungsi kecil yang memungkinkan saya untuk menghapus ekstensi dari nama file.
Saya telah menemukan banyak contoh dengan googling, tetapi itu buruk, karena mereka hanya menghapus sebagian dari string dengan "." . Mereka menggunakan titik untuk pembatas dan hanya memotong tali.
Lihat skrip ini,
$from = preg_replace('/\.[^.]+$/','',$from);
atau
$from=substr($from, 0, (strlen ($from)) - (strlen (strrchr($filename,'.'))));
Saat kita menambahkan string seperti ini:
Ini adalah contoh dari somestring
Ini hanya akan mengembalikan "Ini" ...
Ekstensi dapat memiliki 3 atau 4 karakter, jadi kita harus memeriksa apakah titik berada pada posisi 4 atau 5, lalu menghapusnya.
Bagaimana caranya?
Jawaban:
Coba yang ini:
$withoutExt = preg_replace('/\\.[^.\\s]{3,4}$/', '', $filename);
Jadi, ini cocok dengan titik yang diikuti oleh tiga atau empat karakter yang bukan merupakan titik atau spasi. Aturan "3 atau 4" mungkin harus dilonggarkan, karena ada banyak ekstensi file yang lebih pendek atau lebih panjang.
sumber
20120720.something.somethingelse.jpg
"$var"
{2,4}
alih-alih{3,4}
http://php.net/manual/en/function.pathinfo.php
$filename = pathinfo('filename.md.txt', PATHINFO_FILENAME); // returns 'filename.md'
sumber
Dari manual, pathinfo :
<?php $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"; // Since PHP 5.2.0 ?>
Tidak harus menjadi jalur yang lengkap untuk beroperasi dengan benar. Ini akan seperti gembira mengurai
file.jpg
sebagai/path/to/my/file.jpg
.sumber
Gunakan basename PHP ()
(PHP 4, PHP 5)
var_dump(basename('test.php', '.php'));
Keluaran: string (4) "test"
sumber
Ini adalah solusi yang agak mudah dan akan berfungsi tidak peduli berapa lama ekstensi atau berapa banyak titik atau karakter lain di dalam string.
$filename = "abc.def.jpg"; $newFileName = substr($filename, 0 , (strrpos($filename, "."))); //$newFileName will now be abc.def
Pada dasarnya ini hanya mencari kemunculan terakhir. lalu menggunakan substring untuk mengambil semua karakter hingga saat itu.
Ini mirip dengan salah satu contoh Anda di Google tetapi lebih sederhana, lebih cepat, dan lebih mudah daripada ekspresi reguler dan contoh lainnya. Baiklah. Semoga bisa membantu seseorang.
sumber
.htaccess
Anda dapat menggunakan apa yang telah dibangun PHP untuk membantu ...
$withoutExt = pathinfo($path, PATHINFO_DIRNAME) . '/' . pathinfo($path, PATHINFO_FILENAME);
Meskipun jika Anda hanya berurusan dengan nama file (
.somefile.jpg
), Anda akan mendapatkan ...Lihat di CodePad.org
Atau gunakan regex ...
$withoutExt = preg_replace('/\.' . preg_quote(pathinfo($path, PATHINFO_EXTENSION), '/') . '$/', '', $path);
Lihat di CodePad.org
Jika Anda tidak memiliki jalur, tetapi hanya nama file, ini akan berfungsi dan menjadi lebih singkat ...
Lihat di CodePad.org
Tentu saja, keduanya hanya mencari titik terakhir (
.
).sumber
.htaccess
Kode berikut berfungsi dengan baik untuk saya, dan cukup singkat. Itu hanya memecah file menjadi array yang dibatasi oleh titik-titik, menghapus elemen terakhir (yang secara hipotetis adalah ekstensi), dan mereformasi array dengan titik-titik lagi.
$filebroken = explode( '.', $filename); $extension = array_pop($filebroken); $fileTypeless = implode('.', $filebroken);
sumber
.htaccess
Merekomendasikan penggunaan:
pathinfo
denganPATHINFO_FILENAME
$filename = 'abc_123_filename.html'; $without_extension = pathinfo($filename, PATHINFO_FILENAME);
sumber
Sebenarnya itu adalah hal yang benar untuk dilakukan. Silakan gunakan itu.
Ekstensi file adalah segalanya setelah titik terakhir, dan tidak ada persyaratan untuk ekstensi file menjadi sejumlah karakter tertentu. Bahkan hanya berbicara tentang Windows, itu sudah dilengkapi dengan ekstensi file yang tidak sesuai dengan 3-4 karakter, seperti misalnya.
.manifest
.sumber
.htaccess
dan.htpasswd
di lingkungan apache.Ada beberapa cara untuk melakukannya, tetapi menurut saya salah satu cara yang lebih cepat adalah sebagai berikut
// $filename has the file name you have under the picture $temp = explode( '.', $filename ); $ext = array_pop( $temp ); $name = implode( '.', $temp );
Solusi lainnya adalah ini. Saya belum mengujinya, tetapi sepertinya itu harus berfungsi untuk beberapa periode dalam nama file
$name = substr($filename, 0, (strlen ($filename)) - (strlen (strrchr($filename,'.'))));
Juga:
$info = pathinfo( $filename ); $name = $info['filename']; $ext = $info['extension']; // Or in PHP 5.4, i believe this should work $name = pathinfo( $filename )[ 'filename' ];
Di semua ini,
$name
berisi nama file tanpa ekstensisumber
$image_name = "this-is.file.name.jpg"; $last_dot_index = strrpos($image_name, "."); $without_extention = substr($image_name, 0, $last_dot_index);
Keluaran:
sumber
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);
Tambahkan itu untuk mendapatkan ekstensi file.Seperti yang disebutkan orang lain, gagasan membatasi ekstensi ke sejumlah karakter tertentu tidak valid. Mengikuti ide array_pop, memikirkan string yang dipisahkan sebagai array, fungsi ini telah berguna bagi saya ...
function string_pop($string, $delimiter){ $a = explode($delimiter, $string); array_pop($a); return implode($delimiter, $a); }
Pemakaian:
$filename = "pic.of.my.house.jpeg"; $name = string_pop($filename, '.'); echo $name;
Keluaran:
pic.of.my.house (note it leaves valid, non-extension "." characters alone)
Beraksi:
http://sandbox.onlinephpfunctions.com/code/5d12a96ea548f696bd097e2986b22de7628314a0
sumber
Anda dapat menyetel panjang pola ekspresi reguler dengan menggunakan
{x,y}
operator.{3,4}
akan cocok jika pola sebelumnya terjadi 3 atau 4 kali.Tapi saya rasa Anda tidak benar-benar membutuhkannya. Apa yang akan Anda lakukan dengan file bernama "This.is"?
sumber
Ini berfungsi ketika ada beberapa bagian pada ekstensi dan pendek serta efisien:
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
sumber
Gunakan ini:
strstr('filename.ext','.',true); //result filename
sumber
Coba gunakan yang ini. itu pasti akan menghapus ekstensi file.
$filename = "image.jpg"; $e = explode(".", $filename); foreach($e as $key=>$d) { if($d!=end($e) { $new_d[]=$d; } } echo implode("-",$new_t); // result would be just the 'image'
sumber
EDIT : Pendekatan paling cerdas IMHO, ini menghapus titik terakhir dan teks berikut dari nama file (alias ekstensi):
$name = basename($filename, '.' . end(explode('.', $filename)));
Bersulang ;)
sumber
end()
tidak seharusnya berfungsi dengan fungsi yang diteruskan sebagai parameter. Ini juga menghasilkan pemberitahuan: Hanya variabel yang harus diteruskan dengan referensiMendarat di halaman ini untuk mencari cara tercepat untuk menghapus ekstensi dari nama file angka dari
glob()
hasil.Jadi saya melakukan beberapa tes benchmark yang sangat sederhana dan menemukan bahwa ini adalah metode tercepat. Itu kurang dari separuh waktu
preg_replace()
:$result = substr($fileName,0,-4);
Sekarang saya tahu bahwa semua file di saya
glob()
memiliki.zip
ekstensi, jadi saya bisa melakukan ini.Jika ekstensi file tidak diketahui dengan panjang yang tidak diketahui, metode berikut akan berfungsi dan masih sekitar 20% lebih cepat dari itu
preg_replace()
. Artinya, asalkan ada perpanjangannya.$result = substr($fileName,0,strrpos($fileName,'.'));
Kode tes benchmark dasar dan hasilnya:
$start = microtime(true); $loop = 10000000; $fileName = 'a.LONG-filename_forTest.zip'; $result; // 1.82sec preg_replace() unknown ext //do { // $result = preg_replace('/\\.[^.\\s]{3,4}$/','',$fileName); //} while(--$loop); // 1.7sec preg_replace() known ext //do { // $result = preg_replace('/.zip$/','',$fileName); //} while(--$loop); // 4.57sec! - pathinfo //do { // $result = pathinfo($fileName,PATHINFO_FILENAME); //} while(--$loop); // 2.43sec explode and implode //do { // $result = implode('.',explode('.',$fileName,-1)); //} while(--$loop); // 3.74sec basename, known ext //do { // $result = basename($fileName,'.zip'); //} while(--$loop); // 1.45sec strpos unknown ext //do { // $result = substr($fileName,0,strrpos($fileName,'.')); //} while(--$loop); // 0.73sec strpos - known ext length do { $result = substr($fileName,0,-4); } while(--$loop); var_dump($fileName); var_dump($result); echo 'Time:['.(microtime(true) - $start).']'; exit;
sumber