Cara menghapus ekstensi dari string (hanya ekstensi nyata!)

139

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?

marc
sumber
1
Apa yang dimaksud dengan ekstensi "nyata"? Anda ingin menghapus 4 atau karakter les terakhir jika diawali dengan titik?
clyfe
"Col. Shrapnel" - dirancang untuk pengguna Windows. "clyfe" - ya, saya ingin menghapus semuanya setelah titik, tetapi hanya jika berada di posisi 4 atau 5, yang akan mewakili ".jpeg" atau ".mp3". Saya hanya ingin menghapusnya. Saya tahu saya bisa melakukannya secara manual menggunakan str-pos dan memotong string menggunakan pernyataan if (jika 5 pos = titik lalu potong (rtrim) dari kanan 5 karakter, jika 4 pos = titik lalu rtrim 4, jika tidak kembali tanpa modifikasi. Tapi mungkin ini solusi yang lebih cepat.
marc
3
Bagaimana dengan file .package? Atau .unity? Sepertinya agak sewenang-wenang untuk membatasi ekstensi hingga 4 karakter.
rdb

Jawaban:

176

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.

nickf
sumber
masalahnya adalah ada juga orang yang mengganti nama file seperti:20120720.something.somethingelse.jpg
Obmerk Kronen
3
Saya tidak berpikir ini akan bekerja dengan file dengan dua karakter sebagai ekstensi
NaturalBornCamper
1
ty! harap dicatat bahwa Anda harus menggunakan tanda kutip tunggal jika Anda tidak melakukan substitusi variabel misalnya"$var"
aelgoa
Nah, untuk menggunakannya dengan file .py saya rasa Anda harus menambahkan 2,3,4 bukan hanya 3,4:> terima kasih!
voghDev
2
@voghDev untuk mendukung ekstensi dengan 2 hingga 4 karakter yang harus Anda tambahkan {2,4}alih-alih{3,4}
Timo Huovinen
83

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.jpgsebagai /path/to/my/file.jpg.

Erik
sumber
Saya sudah memeriksa ini. Kesalahan yang sama seperti di atas. Coba akses "$ path_parts ['filename']" dari T.sec - "xxx" 23 12 32 3 a twym2 Ini hanya akan mengembalikan T. Dari contoh di atas seharusnya tidak menghapus apapun!
marc
58

Gunakan basename PHP ()

(PHP 4, PHP 5)

var_dump(basename('test.php', '.php'));

Keluaran: string (4) "test"

Yasen
sumber
2
+1 Jika persyaratan ekstensi yang disebutkan tidak ketat, ini akan menjadi jawaban yang tepat.
Kayla
1
Melihat komit di php.net ada ide tentang bekerja dengan array ... yang menurut saya dapat ditingkatkan menggunakan sesuatu seperti array-walk
CrandellWS
35

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.

wprenison.dll
sumber
2
Saya tahu ini akan datang sangat terlambat, tetapi saya pikir ini adalah jawaban terbaik. Bekerja dengan baik.
Agbogidi Michael
1
ini tidak akan berfungsi untuk * nix file tersembunyi tanpa ekstensi misalnya,.htaccess
Fr0zenFyr
12

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

./somefile

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

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

Lihat di CodePad.org

Tentu saja, keduanya hanya mencari titik terakhir ( .).

alex
sumber
Seperti yang disebutkan pada baris solusi terakhir, itu akan gagal untuk nama file seperti.htaccess
Fr0zenFyr
8

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);
Emanegux
sumber
akan mengembalikan false jika file tidak memiliki ekstensi atau kosong jika file adalah.htaccess
Timo Huovinen
8

Merekomendasikan penggunaan: pathinfo dengan PATHINFO_FILENAME

$filename = 'abc_123_filename.html';
$without_extension = pathinfo($filename, PATHINFO_FILENAME);
Alex
sumber
5

Saya menemukan banyak contoh di Google tetapi ada yang buruk karena hanya menghapus sebagian dari string dengan "."

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.

bobince
sumber
2
..dan jangan lupa .htaccessdan .htpasswddi lingkungan apache.
h2ooooooo
4

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, $nameberisi nama file tanpa ekstensi

Ascherer
sumber
4
$image_name = "this-is.file.name.jpg";
$last_dot_index = strrpos($image_name, ".");
$without_extention = substr($image_name, 0, $last_dot_index);

Keluaran:

this-is.file.name
Abhishek
sumber
1
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);Tambahkan itu untuk mendapatkan ekstensi file.
I_ATE_YOUR_WORK_FILES
2

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

jbobbins
sumber
1

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"?

Akal Sehat Anda
sumber
1

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
Dan Bray
sumber
0

Gunakan ini:

strstr('filename.ext','.',true);
//result filename
Shintadoniku Alyssa
sumber
Ini hanya berfungsi jika nama file belum memiliki titik. PHP Docs menyebutkan kejadian pertama dari needle
relipse
0

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'
Gilbert Aldava
sumber
Anda bisa menguranginya menjadi satu baris dengan array_pop ()
Peter Brand
0

EDIT : Pendekatan paling cerdas IMHO, ini menghapus titik terakhir dan teks berikut dari nama file (alias ekstensi):

$name = basename($filename, '.' . end(explode('.', $filename)));

Bersulang ;)

andcl
sumber
Meskipun bisa berfungsi, end()tidak seharusnya berfungsi dengan fungsi yang diteruskan sebagai parameter. Ini juga menghasilkan pemberitahuan: Hanya variabel yang harus diteruskan dengan referensi
CodeBrauer
0

Mendarat 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 .zipekstensi, 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;
Tigger
sumber