Dizeden uzantısı nasıl kaldırılır (tek gerçek uzatma!)

10 Cevap

Bana bir dosya adı uzantısını kaldırmak sağlayan küçük bir işlev için arıyveyaum.

Googling birçok örnek bulduk, ama onlar sadece birlikte dize parçası kaldırmak çünkü onlar kötü "." . Onlar sınırlayıcı nokta ve sadece kesilmiş dize kullanabilirsiniz.

Bu yazılara bakmak,

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

veya

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

Bunun gibi dize eklediğinizde:

Somestring arasında This.is örneği

Sadece "Bu" dönecektir ...

The extension can have 3 veya 4 characters, so we have to check if dot is on 4 veya 5 position, and then remove it.

Bu nasıl yapılabilir?

10 Cevap

Bunu dene:

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

Yani, bu bir nokta ya da bir boşluk değil, üç ya da dört karakterin ardından bir nokta eşleşir. Kısa ya da uzun dosya uzantılarının bol beri "3 veya 4" kuralı belki, rahat olmalıdır.

Manuel, 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 olmak zorunda değildir. Bu gibi mutlu file.jpg /path/to/my/file.jpg olarak ayrıştırmak olacaktır.

Kullan PHP basename()

(PHP 4, PHP 5)

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

Çıkışlar: string (4) "test"

Aşağıdaki kod benim için iyi çalışıyor, ve oldukça kısa. Bu sadece noktalar ile sınırlanmış bir diziye dosya yukarı, yine noktalarla dizi (varsayımsal uzantısıdır) son elemanı siler ve reformlar kırar.

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

Ben Google'da bir çok örnek bulunabilir ama sadece dizge parçası kaldırmak çünkü kötü vardır "."

Aslında bu kesinlikle yapmak doğru bir şey olduğunu. Devam edin ve bu kullanın.

Dosya uzantısı son nokta sonra her şey, ve karakter herhangi bir sayı için bir dosya uzantısı için bir gereklilik yoktur. Hatta sadece Windows bahsediyoruz, zaten örn gibi 3-4 karakterleri, uymaz dosya uzantıları ile birlikte geliyor. .manifest.

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

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

Rağmen sadece bir dosya ile ilgili ise (.somefile.jpg), alacak ...

. / Somefile

See it on CodePad.org

Ya da bir regex kullanabilirsiniz ...

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

See it on CodePad.org

Bir yol, ama sadece bir dosya yoksa, bu kadar terser çalışmak ve olacaktır ...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

See it on CodePad.org

Tabii ki, bu ikisi de sadece son dönemde arayın (.).

Orada bunu yapmak için birkaç yolu vardır, ama hızlı yollarından biri şu olduğunu düşünüyorum

// $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, bu. Bunu test sığınak, ama bir dosya içinde birden fazla dönemler için çalışması gerekir 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ı olmadan dosya ismini içerir

Sen {x,y} operatörünü kullanarak normal ifade deseninin uzunluğunu ayarlayabilirsiniz. Yukarıda Verdiğim desen 3 veya 4 kez meydana gelirse {3,4} maç olacaktır.

Ama gerçekten ihtiyacınız olduğunu sanmıyorum. Eğer "This.is" adlı bir dosya ile ne yapacak?

Bunu kullanın:

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

http://php.net/manual/en/function.pathinfo.php

$filename = pathinfo('filename.ext', PATHINFO_FILENAME); // returns 'filename'