To pytanie można przeczytać w dowolnym miejscu w Internecie z różnymi odpowiedziami:
$ext = end(explode('.', $filename));
$ext = substr(strrchr($filename, '.'), 1);
$ext = substr($filename, strrpos($filename, '.') + 1);
$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $filename);
$exts = split("[/\\.]", $filename);
$n = count($exts)-1;
$ext = $exts[$n];
itp.
Jednak zawsze istnieje „najlepszy sposób” i powinno być w przypadku przepełnienia stosu.
php
file-extension
e-satis
źródło
źródło
strrchr($filename, '.');
Odpowiedzi:
Ludzie z innych języków skryptowych zawsze myślą, że ich jest lepszy, ponieważ mają wbudowaną funkcję, aby to zrobić, a nie PHP (patrzę teraz na Pythonistas :-)).
W rzeczywistości istnieje, ale niewiele osób o tym wie. Poznaj
pathinfo()
:Jest to szybkie i wbudowane.
pathinfo()
może dać ci inne informacje, takie jak ścieżka kanoniczna, w zależności od stałej, którą do niej przekazujesz.Pamiętaj, że jeśli chcesz poradzić sobie ze znakami spoza ASCII, musisz najpierw ustawić ustawienia regionalne. NA PRZYKŁAD:
Pamiętaj też, że nie bierze to pod uwagę zawartości pliku ani typu MIME, dostajesz tylko rozszerzenie. Ale o to prosiłeś.
Na koniec zauważ, że działa to tylko dla ścieżki pliku, a nie ścieżki zasobów URL, która jest objęta PARSE_URL.
Cieszyć się
źródło
function get_ext($fname){ return substr($fname, strrpos($fname, ".") + 1); }
ten problem : upewnij się, że plik ma rozszerzenie, ponieważ może on zrobić wszystko, gdy podasz ścieżkę jako argument!pathinfo()
źródło
echo pathinfo('/foo/bar/baz.bill')['extension'];
Przykładowy adres URL:
http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ
A) Nie używaj sugerowanych niebezpiecznych
PATHINFO
:B) Użyj PARSE_URL :
BONUS: Wyświetl wszystkie natywne przykłady PHP
źródło
foo_folder/foo-file.jpg?1345838509
zawiedzie nieszczęśliwie z justpathinfo
, thanxparse_url
dotyczy adresu URL ipathinfo
ścieżki pliku.Istnieje również
SplFileInfo
:Często możesz napisać lepszy kod, jeśli podasz taki obiekt zamiast łańcucha. Twój kod mówi bardziej niż. Od PHP 5.4 jest to jedna linijka:
źródło
->getExtension()
jest dostępny w SplFileInfo od PHP 5.3.6.Odpowiedź E-satis to właściwy sposób na określenie rozszerzenia pliku.
Alternatywnie, zamiast polegać na rozszerzeniu plików, możesz użyć fileinfo do określenia typu pliku MIME.
Oto uproszczony przykład przetwarzania obrazu przesłanego przez użytkownika:
źródło
O ile nie zawiera ścieżki, możesz także użyć:
Gdzie
$fname
znajduje się nazwa pliku, na przykład:my_picture.jpg
. Rezultatem byłoby:jpg
źródło
1) Jeśli używasz (PHP 5> = 5.3.6) , możesz użyć SplFileInfo :: getExtension - Pobiera rozszerzenie pliku
Przykładowy kod
To wyjdzie
2) Innym sposobem uzyskania rozszerzenia, jeśli używasz (PHP 4> = 4.0.3, PHP 5), jest pathinfo
Przykładowy kod
To wyjdzie
// EDYCJA: usunięto nawias klamrowy
źródło
Czasami dobrze jest nie używać
pathinfo($path, PATHINFO_EXTENSION)
. Na przykład:Zauważ też, że
pathinfo
nie obsługuje niektórych znaków spoza ASCII (zwykle po prostu pomija je w danych wyjściowych). W rozszerzeniach zwykle nie stanowi to problemu, ale nie zaszkodzi być świadomym tego ostrzeżenia.źródło
test.19-02-2014.jpeg
ltrim(strrchr($PATH, '.'),'.')
działa jak pathinfo, ale bez tokenizacji wszystkiego.Najprostszym sposobem uzyskania rozszerzenia pliku w PHP jest użycie wbudowanej funkcji PHP pathinfo .
źródło
Możesz spróbować również tego (działa na PHP 5. * i 7):
Wskazówka: zwraca pusty ciąg, jeśli plik nie ma rozszerzenia
źródło
Przepraszam ... „Krótkie pytanie; ale NIE krótka odpowiedź”
Przykład 1 dla PATH
Przykład 2 dla adresu URL
Wyjście z przykładu 1:
Wyjście z przykładu 2:
Bibliografia
https://www.php.net/manual/en/function.pathinfo.php
https://www.php.net/manual/en/function.realpath.php
https://www.php.net/manual/en/function.parse-url.php
źródło
Szybka poprawka byłaby czymś takim.
źródło
$file_ext = end(explode('.', $filename));
zrobić wszystko, co w tej odpowiedzi, w jednym wierszu zamiast czterech..tar.gz
. To nie zadziała, więc jeśli potrzebujesz pełnego rozszerzenia, użyj np.ltrim(strstr($filename, '.'), '.');
Pełnego rozszerzenia zamiast niepoprawnie jakgz
.Oto przykład. Załóżmy, że $ filename to „example.txt”,
Zatem $ ext będzie miał postać „.txt”.
źródło
pathinfo to tablica. Możemy sprawdzić nazwę katalogu, nazwę pliku, rozszerzenie itp .:
źródło
źródło
Możesz także spróbować:
źródło
źródło
To zadziała
źródło
Odkryłem, że rozwiązania
pathinfo()
iSplFileInfo
działają dobrze dla standardowych plików w lokalnym systemie plików, ale możesz napotkać trudności, jeśli pracujesz ze zdalnymi plikami, ponieważ adresy URL prawidłowych obrazów mogą mieć#
(identyfikatory fragmentów) i / lub?
(parametry zapytania) na końcu adresu URL, który oba te rozwiązania (nieprawidłowo) będą traktować jako część rozszerzenia pliku.Odkryłem, że był to niezawodny sposób na użycie
pathinfo()
adresu URL po pierwszym analizowaniu go w celu usunięcia niepotrzebnego bałaganu po rozszerzeniu pliku:źródło
Zastosowanie
substr($path, strrpos($path,'.')+1);
. Jest to najszybsza metoda ze wszystkich porównań.@Kurt Zhong już odpowiedział.
Sprawdźmy wynik porównawczy tutaj: https://eval.in/661574
źródło
Możesz pobrać wszystkie rozszerzenia plików w określonym folderze i wykonywać operacje z określonym rozszerzeniem pliku:
źródło
Rób to szybciej.
Połączenia na niskim poziomie muszą być bardzo szybkie, więc pomyślałem, że warto było to zbadać. Wypróbowałem kilka metod (z różnymi długościami ciągów, długościami przedłużeń, wieloma biegami), oto kilka rozsądnych:
Wyniki nie były bardzo zaskakujące. Słaba
pathinfo
jest (zdecydowanie!) Najwolniejsza (wygląda na to, że próbuje przeanalizować całość, a następnie upuścić wszystkie niepotrzebne części) - amethod3()
(strrpos) jest zdecydowanie najszybsza:UWAGA: pierwsza metoda ma efekt uboczny: zwraca całą nazwę, gdy nie ma rozszerzenia. Z pewnością nie ma sensu mierzyć go dodatkowymi strpos, aby uniknąć takiego zachowania.
Wniosek
Wygląda to jak Droga Samuraja:
źródło
Jeśli szukasz szybkości (na przykład w routerze), prawdopodobnie nie chcesz tokenizować wszystkiego. Wiele innych odpowiedzi się nie powiedzie
/root/my.folder/my.css
źródło
Chociaż „najlepszy sposób” jest dyskusyjny, uważam, że jest to najlepszy sposób z kilku powodów:
tar.gz
źródło
IMO, jest to najlepszy sposób, jeśli masz nazwy plików takie jak name.name.name.ext (brzydkie, ale czasem się zdarza):
źródło
$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $fileName);
podejście preg_replace używamy wyszukiwania wyrażeń regularnych i zastępujemy. W funkcji preg_replace pierwszym parametrem jest wzorzec wyszukiwania, drugi parametr $ 1 jest odniesieniem do wszystkiego, co pasuje do pierwszego (. *), A trzeci parametr to nazwa pliku.
Innym sposobem możemy również użyć strrpos, aby znaleźć pozycję ostatniego wystąpienia „.” w nazwie pliku i zwiększaj tę pozycję o 1, aby eksplodował ciąg z (.)
$ext = substr($fileName, strrpos($fileName, '.') + 1);
źródło
Właściwie tego szukałem.
źródło
Posługiwać się
w celu szybkiego pobrania rozszerzenia (jeśli wiesz na pewno, że twoja nazwa pliku go posiada).
źródło