Zobacz kod:
var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc
function getFileExtension(filename) {
/*TODO*/
}
javascript
file-extension
Sergio del Amo
źródło
źródło
return filename.substring(0,1) === '.' ? '' : filename.split('.').slice(1).pop() || '';
Zajmuje się.file
także plikami (ukrytymi pod Uniksem, jak sądzę). To znaczy, jeśli chcesz zachować to jako linijkę, co jest nieco niechlujne według mojego gustu.Nie komplikuj :)
Edytować:
To kolejne rozwiązanie, które moim zdaniem jest bardziej wydajne:
Niektóre przypadki narożne są lepiej obsługiwane przez odpowiedź VisioN poniżej, w szczególności pliki bez rozszerzenia (
.htaccess
itp. Zawarte).Jest bardzo wydajny i radzi sobie ze skrzynkami narożnymi w znacznie lepszy sposób, zwracając
""
zamiast pełnego łańcucha, gdy przed kropką nie ma kropki ani łańcucha. To bardzo dobrze wykonane rozwiązanie, choć trudne do odczytania. Wstaw go do swojej biblioteki pomocników i po prostu użyj.Stara edycja:
Bezpieczniejsza implementacja, jeśli zamierzasz uruchomić pliki bez rozszerzenia lub ukryte pliki bez rozszerzenia (patrz komentarz VisioN do odpowiedzi Toma powyżej) byłoby czymś podobnym
Jeśli
a.length
jest jeden, jest to widoczny plik bez rozszerzenia, tj. plikJeśli
a[0] === ""
ia.length === 2
jest to ukryty plik bez rozszerzenia tj. .htaccessMam nadzieję, że pomoże to rozwiązać problemy z nieco bardziej złożonymi sprawami. Jeśli chodzi o wydajność, uważam, że to rozwiązanie jest nieco wolniejsze niż regex w większości przeglądarek. Jednak do najpopularniejszych celów ten kod powinien być doskonale użyteczny.
źródło
filename
faktycznie nie ma rozszerzenia? Czy nie zwróciłoby to po prostu podstawowej nazwy pliku, co byłoby trochę złe?Następujące rozwiązanie jest szybkie i wystarczająco krótkie , aby można było z niego korzystać w operacjach masowych i oszczędzać dodatkowe bajty:
Oto inne uniwersalne rozwiązanie nieregexp w jednym wierszu:
Oba działają poprawnie z nazwami bez rozszerzenia (np. Mój_plik ) lub zaczynającymi się od
.
kropki (np .htaccess ):Jeśli zależy Ci na prędkości, możesz uruchomić test porównawczy i sprawdzić, czy dostarczone rozwiązania są najszybsze, a krótkie niezwykle szybko:
Jak działa ten krótki:
String.lastIndexOf
Metoda zwraca ostatnią pozycję podłańcucha (tj."."
) w danym ciągu (tjfname
.). Jeśli podciąg nie zostanie znaleziony, metoda zwraca-1
.-1
i0
, które odpowiednio odnoszą się do nazw bez rozszerzenia (np."name"
) I nazw zaczynających się od kropki (np".htaccess"
.).>>>
), jeśli jest używany z zerem, wpływa na liczby ujemne przekształcane-1
do4294967295
i-2
do4294967294
, co jest przydatne do pozostania niezmienionej nazwy pliku w przypadkach krawędzi (tutaj jest to podstęp).String.prototype.slice
wyodrębnia część nazwy pliku z pozycji obliczonej zgodnie z opisem. Jeśli liczba pozycji jest większa niż długość ciągu znaków, metoda zwraca""
.Jeśli chcesz bardziej przejrzystego rozwiązania, które będzie działało w ten sam sposób (plus z dodatkową obsługą pełnej ścieżki), sprawdź następującą rozszerzoną wersję. To rozwiązanie będzie wolniejsze niż poprzednie jednowarstwowe, ale o wiele łatwiejsze do zrozumienia.
Wszystkie trzy warianty powinny działać w dowolnej przeglądarce internetowej po stronie klienta i mogą być również używane w kodzie NodeJS po stronie serwera.
źródło
Testowane z
Również
źródło
źródło
źródło
źródło
źródło
Kod
Test
Zauważ, że przy braku zapytania fragment może być nadal obecny.
JSLint
0 Ostrzeżenia.
źródło
Szybki i działa poprawnie ze ścieżkami
Niektóre przypadki krawędzi
Rozwiązania korzystające z podziału są wolne, a rozwiązania z lastIndexOf nie obsługują przypadków skrajnych.
źródło
.exec()
. Twój kod będzie lepszy jako(filename.match(/[^\\/]\.([^\\/.]+)$/) || [null]).pop()
.po prostu chciałem się tym podzielić.
chociaż ma to wadę, że pliki bez rozszerzenia zwracają ostatni ciąg. ale jeśli to zrobisz, naprawi to wszystko:
źródło
slice
metoda odnosi się raczej do tablic niż do łańcuchów. Dla ciągów znakówsubstr
lubsubstring
będzie działać.String.prototype.slice
iArray.prototype.slice
tak, że to działa w obie strony, rodzaj metodyJestem pewien, że ktoś może i będzie minimalizować i / lub optymalizować mój kod w przyszłości. Ale na razie mam 200% pewności, że mój kod działa w każdej wyjątkowej sytuacji (np. Tylko z samą nazwą pliku , z względnymi , zależnymi od katalogu głównego i bezwzględnymi adresami URL, z tagami fragmentów
#
, ciągami zapytań?
i cokolwiek innego w przeciwnym razie możesz rzucić na nią), bezbłędnie i precyzyjnie.Aby uzyskać dowód, odwiedź: https://projects.jamesandersonjr.com/web/js_projects/get_file_extension_test.php
Oto JSFiddle: https://jsfiddle.net/JamesAndersonJr/ffcdd5z3/
Nie jestem zbyt pewny siebie, ani nie wydmuchuję własnej trąby, ale nie widziałem żadnego bloku kodu dla tego zadania (znajdowanie „poprawnego” rozszerzenia pliku, pośród baterii różnych
function
argumentów wejściowych), który działa tak dobrze, jak to.Uwaga: Z założenia, jeśli rozszerzenie pliku nie istnieje dla podanego ciągu wejściowego, po prostu zwraca pusty ciąg
""
, nie błąd ani komunikat o błędzie.Uwaga (2): Jeśli podoba ci się mój kod, pamiętaj o dodaniu go do biblioteki i repozytoriów twojej biblioteki js, ponieważ ciężko pracowałem nad jej udoskonaleniem, a szkoda byłoby marnować ją. Więc bez zbędnych ceregieli, oto:
Cieszyć się! Jesteś bardzo mile widziany!:
źródło
źródło
Jeśli masz do czynienia z adresami URL, możesz użyć:
Demo: https://jsfiddle.net/squadjot/q5ard4fj/
źródło
Spróbuj tego:
źródło
edit: Dziwnie (a może nie)
$1
drugi argument metody replace nie wydaje się działać ... Przepraszam.źródło
Właśnie zdałem sobie sprawę, że nie wystarczy skomentować odpowiedź p4bl0, chociaż odpowiedź Toma wyraźnie rozwiązuje problem:
źródło
W przypadku większości aplikacji prosty skrypt, taki jak
działałoby dobrze (jak zapewnia Tom). Nie jest to jednak głupi dowód. Nie działa, jeśli podano następującą nazwę pliku:
Może to być trochę przesada, ale sugeruję użycie parsera URL, takiego jak ten, aby uniknąć niepowodzenia z powodu nieprzewidzianych nazw plików.
Korzystając z tej konkretnej funkcji, możesz uzyskać nazwę pliku w następujący sposób:
Spowoduje to wygenerowanie pliku „image.jpg” bez zmiennych adresu URL. Następnie możesz pobrać rozszerzenie pliku.
źródło
źródło
//stosowanie
rozszerzenie („file.jpeg”)
zawsze zwraca rozszerzenie dolne cas, dzięki czemu można sprawdzić, czy zmiana pola działa dla:
plik.JpEg
plik (bez rozszerzenia)
plik. (bez rozszerzenia)
źródło
Jeśli szukasz określonego rozszerzenia i znasz jego długość, możesz użyć substr :
Dokumentacja JavaScript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr
źródło
Jestem dużo księżyców spóźnionych na przyjęcie, ale dla uproszczenia używam czegoś takiego
źródło
W
path
module znajduje się standardowa funkcja biblioteki :Wynik:
Jeśli chcesz tylko format:
Jeśli nie ma rozszerzenia, funkcja zwróci pusty ciąg znaków:
Jeśli używasz Węzła,
path
jest on wbudowany. Jeśli celujesz w przeglądarkę, Webpack spakujepath
dla ciebie implementację. Jeśli celujesz w przeglądarkę bez pakietu Webpack, możesz dołączyć przeglądanie ścieżek ręcznie .Nie ma powodu do dzielenia ciągów ani wyrażeń regularnych.
źródło
„one-liner”, aby uzyskać nazwę pliku i rozszerzenie
reduce
oraz zniszczenie tablicy :z lepszym wcięciem:
źródło
Jednowierszowe rozwiązanie, które uwzględni również parametry zapytania i wszelkie znaki w adresie URL.
źródło
page.html#fragment
), To zwróci rozszerzenie pliku i fragment.To proste rozwiązanie
Testy
źródło
Odpowiedź Wallacera jest dobra, ale potrzebna jest jeszcze jedna kontrola.
Jeśli plik nie ma rozszerzenia, użyje nazwy pliku jako rozszerzenia, co nie jest dobre.
Spróbuj tego:
źródło
Nie zapominaj, że niektóre pliki nie mogą mieć rozszerzenia, więc:
źródło
źródło
źródło