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

marc
źródło
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.

nickf
źródło
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.

Erik
źródło
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"

Lamy
źródło
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.

wprenison
źródło
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 ( .).

Alex
źródło
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);
Emanegux
źródło
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.

bobince
źródło
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);
Alex
źródło
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

Ascherer
źródło
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
Abhishek
źródło
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

jbobbins
źródło
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”?

Twój zdrowy rozsądek
źródło
0

Użyj tego:

strstr('filename.ext','.',true);
//result filename
Shintadoniku Alyssa
źródło
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'
Gilbert Aldava
źródło
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 ;)

andcl
źródło
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
Dan Bray
źródło