Jak usunąć rozszerzenie z ciągu (tylko prawdziwe rozszerzenie!)


135

Szukam małej funkcji, która pozwoli mi usunąć rozszerzenie z nazwy pliku.

Znalazłem wiele przykładów, szukając w Google, ale są one złe, ponieważ po prostu usuwają część ciągu z "." . Używają kropki jako ogranicznika i po prostu przecinają strunę.

Spójrz na te skrypty,

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

lub

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

Kiedy dodamy ciąg w ten sposób:

This.is przykład somestring

Zwróci tylko „To” ...

Rozszerzenie może mieć 3 lub 4 znaki, więc musimy sprawdzić, czy kropka jest na pozycji 4 czy 5, a następnie ją usunąć.

Jak można to zrobić?


1
Co to jest „prawdziwe” rozszerzenie? Chcesz usunąć ostatnie 4 lub les chary, jeśli są poprzedzone kropką?
clyfe

„Col. Shrapnel” - jest przeznaczony dla użytkowników systemu Windows. „clyfe” - tak, chcę usunąć wszystko po kropce, ale tylko jeśli jest na pozycji 4 lub 5, co będzie reprezentować „.jpeg” lub „.mp3”. Po prostu nie chcę tego usunąć. Wiem, że mogę to zrobić ręcznie, używając str-pos i ciągu cięcia, używając instrukcji if (jeśli 5 pos = kropka to cut (rtrim) z prawej strony 5 znaków, jeśli 4 pos = kropka to rtrim 4, w przeciwnym razie wróć bez żadnych modyfikacji. Ale może to szybsze rozwiązanie.
marc

3
A co z plikami .package? Lub .unity? Ograniczenie rozszerzenia do 4 znaków wydaje się nieco arbitralne.
rdb

Odpowiedzi:


172

Spróbuj tego:

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

Tak więc dopasowuje kropkę, po której następują trzy lub cztery znaki, które nie są kropką ani spacją. Zasada „3 lub 4” powinna prawdopodobnie zostać złagodzona, ponieważ istnieje wiele rozszerzeń plików, które są krótsze lub dłuższe.


problem polega na tym, że są też osoby, które zmieniają nazwy plików jak:20120720.something.somethingelse.jpg
Obmerk Kronen

3
Nie sądzę, żeby to zadziałało z plikami z dwoma znakami jako rozszerzeniem
NaturalBornCamper

1
ty! pamiętaj, że powinieneś używać pojedynczych cudzysłowów, jeśli nie wykonujesz podstawiania zmiennych, np."$var"
aelgoa

cóż, aby używać go z plikami .py, myślę, że musisz dodać 2,3,4 zamiast tylko 3,4:> dzięki!
voghDev

2
@voghDev, aby obsługiwać rozszerzenia zawierające od 2 do 4 znaków, które należy dodać {2,4}zamiast{3,4}
Timo Huovinen


81

Z instrukcji, 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
?>

Nie musi to być pełna ścieżka, aby działać poprawnie. Będzie tak samo szczęśliwie analizować, file.jpgjak /path/to/my/file.jpg.


Już to sprawdziłem. Ten sam błąd co powyżej. Spróbuj uzyskać dostęp do "$ path_parts ['filename']" z T.sec - "xxx" 23 12 32 3 a twym2 Zwróci tylko T. Z powyższego przykładu nie powinno niczego usuwać!
marc

56

Użyj PHP basename ()

(PHP 4, PHP 5)

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

Wyjścia: string (4) "test"


2
+1 Gdyby wspomniane wymagania dotyczące rozszerzenia nie były surowe, byłaby to doskonała odpowiedź.
Kayla

1
Patrząc na zmiany na php.net, pojawia się pomysł na pracę z tablicą ... którą myślę, że można by ulepszyć, używając czegoś takiego jak spacer po tablicy
CrandellWS

35

Jest to dość łatwe rozwiązanie i będzie działać bez względu na długość rozszerzenia lub liczbę kropek lub innych znaków w ciągu.

$filename = "abc.def.jpg";

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

//$newFileName will now be abc.def

W zasadzie to wyszukuje tylko ostatnie wystąpienie. a następnie używa podłańcucha do pobrania wszystkich znaków do tego momentu.

Jest podobny do jednego z przykładów z Google, ale prostszy, szybszy i łatwiejszy niż wyrażenia regularne i inne przykłady. No i tak imo. Mam nadzieję, że to komuś pomoże.


2
Wiem, że to zbyt późno, ale myślę, że to najlepsza odpowiedź. Działa świetnie.
Agbogidi Michael

to nie zadziała w przypadku ukrytych plików * nix bez rozszerzenia, na przykład.htaccess
Fr0zenFyr

12

Możesz użyć wbudowanego oprogramowania PHP, aby pomóc ...

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

Chociaż jeśli masz do czynienia tylko z nazwą pliku ( .somefile.jpg), otrzymasz ...

./somefile

Zobacz to na CodePad.org

Lub użyj wyrażenia regularnego ...

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

Zobacz to na CodePad.org

Jeśli nie masz ścieżki, ale tylko nazwę pliku, to zadziała i będzie znacznie bardziej zwięzłe ...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

Zobacz to na CodePad.org

Oczywiście oba szukają tylko ostatniego okresu ( .).


Jak wspomniano w ostatniej linii rozwiązania, zakończy się niepowodzeniem dla nazw plików, takich jak.htaccess
Fr0zenFyr

8

Poniższy kod działa dobrze i jest dość krótki. Po prostu dzieli plik na tablicę oddzieloną kropkami, usuwa ostatni element (który hipotetycznie jest rozszerzeniem) i ponownie przekształca tablicę z kropkami.

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

zwróci wartość false, jeśli plik nie ma rozszerzenia lub jest pusty, jeśli plik jest.htaccess
Timo Huovinen

5

Znalazłem wiele przykładów w Google, ale są złe, ponieważ po prostu usuń część ciągu z "."

Właściwie jest to absolutnie właściwa rzecz. Śmiało i użyj tego.

Rozszerzenie pliku znajduje się po ostatniej kropce i nie jest wymagane, aby rozszerzenie pliku zawierało określoną liczbę znaków. Nawet mówiąc tylko o systemie Windows, ma już rozszerzenia plików, które nie mieszczą 3-4 znaków, takie jak np. .manifest.


2
..i nie zapominajmy .htaccessi .htpasswdApache środowiskach.
h2ooooooo

5

Polecam użycie: pathinfo z PATHINFO_FILENAME

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

4

Jest na to kilka sposobów, ale myślę, że jeden z szybszych jest następujący

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

Innym rozwiązaniem jest to. Nie testowałem tego, ale wygląda na to, że powinien działać przez wiele okresów w nazwie pliku

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

Również:

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

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

W każdym z nich $namezawiera nazwę pliku bez rozszerzenia


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

Wynik:

this-is.file.name

1
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);Dodaj to, aby uzyskać rozszerzenie pliku.
I_ATE_YOUR_WORK_FILES

2

Jak wspominają inni, pomysł ograniczenia rozszerzenia do określonej liczby znaków jest błędny. Idąc z ideą array_pop, myśląc o rozdzielanym ciągu jako tablicy, ta funkcja była dla mnie przydatna ...

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

Stosowanie:

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

Wyjścia:

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

W akcji:

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


1

Możesz ustawić długość wzorca wyrażenia regularnego za pomocą {x,y}operatora.{3,4}pasowałaby, gdyby poprzedni wzorzec wystąpił 3 lub 4 razy.

Ale nie sądzę, że naprawdę tego potrzebujesz. Co zrobisz z plikiem o nazwie „This.is”?


0

Użyj tego:

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

Działa to tylko wtedy, gdy nazwa pliku nie ma już kropki. Dokumenty PHP wspominają o pierwszym wystąpieniu igły
relipse

0

Spróbuj użyć tego. na pewno usunie rozszerzenie pliku.

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

Możesz zredukować to do jednej linii za pomocą funkcji array_pop ()
Peter Brand,

0

EDYCJA : Najmądrzejsze podejście IMHO, usuwa ostatni punkt i następujący tekst z nazwy pliku (inaczej rozszerzenie):

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

Twoje zdrowie ;)


Chociaż może działać, end()nie powinno działać z funkcją przekazaną jako parametr. Wyświetla również powiadomienie: Tylko zmienne powinny być przekazywane przez odniesienie
CodeBrauer

0

Działa to w przypadku wielu części przedłużenia i jest jednocześnie krótkie i wydajne:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.