Dizeden uzantı nasıl kaldırılır (yalnızca gerçek uzantı!)


135

Bir dosya adından uzantıyı kaldırmak için izin veren küçük bir işlev arıyorum.

Googling ile birçok örnek buldum, ancak kötü, çünkü onlar sadece "." . Sınırlayıcı için nokta kullanırlar ve sadece dize keserler.

Şu senaryolara bak,

$from = preg_replace('/\.[^.]+$/','',$from);

veya

 $from=substr($from, 0, (strlen ($from)) - (strlen (strrchr($filename,'.'))));

Dizeyi şöyle eklediğimizde:

Bu bir somestring örneğidir

Sadece "Bu" dönecektir ...

Uzantının 3 veya 4 karakteri olabilir, bu nedenle noktanın 4 veya 5 konumunda olup olmadığını kontrol etmeli ve sonra kaldırmalıyız.

Nasıl yapılabilir?


1
"Gerçek" uzantı nedir? Bir noktadan önce geldiyse son 4 veya les karakterini kaldırmak istiyor musunuz?
clyfe

"Col. Shrapnel" - Windows kullanıcıları için tasarlanmıştır. "clyfe" - evet, ben noktadan sonra her şeyi kaldırmak istiyorum, ama sadece 4 veya 5 pozisyonda ise, ne ".jpeg" veya ".mp3" temsil edecek. Sadece kaldırmak istemiyorum. Ben el ile str-pos kullanarak yapabilir ve if deyimi kullanarak kesme dize biliyorum (eğer 5 pos = dot sonra (5) sağ 5 karakterleri kesmek (rtrim), eğer 4 pos = dot sonra rtrim 4, başka herhangi bir değişiklik olmadan geri dönün. belki daha hızlı bir çözümdür
marc

3
.Package dosyaları ne olacak? Veya .unity? Bir uzantıyı 4 karakterle sınırlamak biraz keyfi görünüyor.
rdb

Yanıtlar:


172

Bunu dene:

$withoutExt = preg_replace('/\\.[^.\\s]{3,4}$/', '', $filename);

Bu, bir nokta ve ardından nokta veya boşluk olmayan üç veya dört karakterle eşleşir. "3 veya 4" kuralı, daha kısa veya daha uzun dosya uzantıları olduğundan büyük olasılıkla gevşetilmelidir.


Sorun şu ki dosyaları yeniden adlandıran insanlar var:20120720.something.somethingelse.jpg
Obmerk Kronen

3
Bunun bir uzantı olarak iki karakterli dosyalarla çalışacağını sanmıyorum
NaturalBornCamper

1
ty! Değişken değiştirme yapmazsanız tek tırnak kullanmanız gerektiğini lütfen unutmayın. örneğin"$var"
aelgoa

iyi .py dosyaları ile kullanmak için sanırım sadece 3,4 yerine 2,3,4 eklemek zorunda:> teşekkürler!
voghDev

2
Eklemek gerekir 2 ila 4 karakterler ile destek uzantılarına @voghDev {2,4}yerine{3,4}
Timo Huovinen


81

Kılavuzdan, 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
?>

Düzgün çalışması için tam bir yol olması gerekmez. Böylesi daha mutlu ayrıştırmak olacak file.jpgşekilde /path/to/my/file.jpg.


Bunu zaten kontrol ettim. Yukarıdaki ile aynı hata. T.sec'ten "$ path_parts ['filename']" 'e erişmeyi deneyin - "xxx" 23 12 32 3 bir twym2 Yalnızca T. değerini döndürür.
marc

56

PHP taban adını kullan ()

(PHP 4, PHP 5)

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

Çıktılar: string (4) "test"


2
+1 Bir uzantı için belirtilen gereksinimler katı olmasaydı, bu mükemmel bir çözüm olurdu.
Kayla

1
Php.net taahhütleri bakarak bir dizi ile çalışma hakkında bir fikir var ... Bence dizi-yürüyüş
CrandellWS

35

Bu oldukça kolay bir çözümdür ve uzantı ne kadar uzun olursa ya da dizede kaç nokta ya da diğer karakter olursa olsun işe yarayacaktır.

$filename = "abc.def.jpg";

$newFileName = substr($filename, 0 , (strrpos($filename, ".")));

//$newFileName will now be abc.def

Temelde bu sadece son oluşumunu arar. ve sonra o noktaya kadar olan tüm karakterleri almak için alt dize kullanır.

Google örneklerinizden birine benzer, ancak normal ifadelerden ve diğer örneklerden daha basit, daha hızlı ve daha kolay. Yine de imo. Umarım birine yardımcı olur.


2
Bunun çok geç olduğunu biliyorum, ama bence bu en iyi cevap. Harika çalışıyor.
Agbogidi Michael

Bu, örneğin uzantısı olmadan * nix gizli dosyalar için çalışmaz.htaccess
Fr0zenFyr

12

PHP yardımcı olmak için yerleşik ne kullanabilirsiniz ...

$withoutExt = pathinfo($path, PATHINFO_DIRNAME) . '/' . pathinfo($path, PATHINFO_FILENAME);

Sadece bir dosya adı ( .somefile.jpg) ile uğraşıyorsanız , alacaksınız ...

./somefile

CodePad.org'da görün

Veya normal ifadeyi kullanın ...

$withoutExt = preg_replace('/\.' . preg_quote(pathinfo($path, PATHINFO_EXTENSION), '/') . '$/', '', $path);

CodePad.org'da görün

Bir yolunuz yoksa, sadece bir dosya adınız varsa, bu işe yarayacak ve çok ters olacak ...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

CodePad.org'da görün

Tabii ki, her ikisi de sadece son dönemi arar ( .).


Son çözüm satırında belirtildiği gibi.htaccess
Fr0zenFyr

8

Aşağıdaki kod benim için iyi çalışıyor ve oldukça kısa. Dosyayı noktalarla ayrılmış bir diziye ayırır, son öğeyi (varsayımsal olarak uzantıdır) siler ve diziyi noktalarla yeniden biçimlendirir.

$filebroken = explode( '.', $filename);
$extension = array_pop($filebroken);
$fileTypeless = implode('.', $filebroken);

dosya uzantısı yoksa yanlış döndürür veya dosya boşsa.htaccess
Timo Huovinen

5

Google'da birçok örnek buldum, ancak kötü var çünkü dizenin bir kısmını "."

Aslında bu kesinlikle yapılacak doğru şey. Devam et ve kullan.

Dosya uzantısı, son noktadan sonraki her şeydir ve dosya uzantısının belirli sayıda karakter olması gerekmez. Sadece Windows hakkında konuşurken bile, örneğin 3-4 karaktere uymayan dosya uzantıları ile birlikte gelir. .manifest.


2
..ve unutmayalım .htaccessve .htpasswdapache ortamlarında.
h2ooooooo

5

Kullanımı tavsiye: pathinfo ile PATHINFO_FILENAME

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

4

Bunu yapmanın birkaç yolu var, ama bence daha hızlı yollardan biri

// $filename has the file name you have under the picture
$temp = explode( '.', $filename );
$ext = array_pop( $temp );
$name = implode( '.', $temp );

Başka bir çözüm de bu. Test etmedim, ancak bir dosya adında birden çok süre çalışması gerekiyor gibi görünüyor

$name = substr($filename, 0, (strlen ($filename)) - (strlen (strrchr($filename,'.'))));

Ayrıca:

$info = pathinfo( $filename );
$name = $info['filename'];
$ext  = $info['extension'];

// Or in PHP 5.4, i believe this should work
$name = pathinfo( $filename )[ 'filename' ];

Bunların hepsinde $name, uzantısız dosya adı bulunur


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

Çıktı:

this-is.file.name

1
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);Dosyanın uzantısını almak için ekleyin.
I_ATE_YOUR_WORK_FILES

2

Diğerlerinin de belirttiği gibi, uzantıyı belirli sayıda karakterle sınırlama fikri geçersizdir. Dizi_pop düşüncesi ile sınırlandırılmış bir dizeyi bir dizi olarak düşünerek, bu işlev benim için yararlı oldu ...

function string_pop($string, $delimiter){
    $a = explode($delimiter, $string);
    array_pop($a);
    return implode($delimiter, $a);
}

Kullanımı:

$filename = "pic.of.my.house.jpeg";
$name = string_pop($filename, '.');
echo $name;

Çıktılar:

pic.of.my.house  (note it leaves valid, non-extension "." characters alone)

Eylemde:

http://sandbox.onlinephpfunctions.com/code/5d12a96ea548f696bd097e2986b22de7628314a0


1

İşlecini kullanarak normal ifade deseninin uzunluğunu ayarlayabilirsiniz {x,y}. {3,4}önceki örnek 3 veya 4 kez oluşursa eşleşir.

Ama gerçekten ihtiyacın olduğunu sanmıyorum. "This.is" adlı bir dosyayla ne yapacaksınız?


0

Bunu kullan:

strstr('filename.ext','.',true);
//result filename

Bu yalnızca dosya adının zaten bir süresi yoksa çalışır. PHP Docs iğnenin ilk oluşumundan bahsediyor
20

0

Bunu kullanmaya çalışın. mutlaka dosya uzantısını kaldıracaktır.

$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'

Bunu array_pop () ile bir satıra azaltabilirsiniz
Peter Brand

0

DÜZENLEME : En akıllı yaklaşım IMHO, son noktayı ve aşağıdaki metni bir dosya adından (uzantı olarak da bilinir) kaldırır :

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

Şerefe;)


Çalışabiliyor olsa da, end()parametre olarak geçirilen bir işlevle çalışması gerekmez. Ayrıca bir bildirim oluşturur: Yalnızca değişkenler başvuru ile iletilmelidir
CodeBrauer

0

Bu, bir uzantının birden fazla parçası olduğunda ve hem kısa hem de verimli olduğunda çalışır:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.