코드보기 :
var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc
function getFileExtension(filename) {
/*TODO*/
}
답변
최신 편집 : 이 질문이 처음 게시 된 이후 많은 것들이 변경되었습니다 .Wallacer의 수정 된 답변 에는 VisioN의 훌륭한 분석 뿐만 아니라 많은 좋은 정보가 있습니다.
편집 : 이것은 이것이 허용되는 대답이기 때문에; wallacer의 답변 은 실제로 훨씬 좋습니다.
return filename.split('.').pop();
나의 옛 대답 :
return /[^.]+$/.exec(filename);
해야합니다.
편집 : PhiLho의 의견에 따라 다음과 같이 사용하십시오.
return (/[.]/.exec(filename)) ? /[^.]+$/.exec(filename) : undefined;
답변
return filename.split('.').pop();
간단하게 유지하십시오 🙂
편집하다:
이것은 내가 생각하는 또 다른 비정규 솔루션입니다.
return filename.substring(filename.lastIndexOf('.')+1, filename.length) || filename;
아래 VisioN의 답변으로 처리가 더 잘되는 코너 사례가 있습니다. 특히 확장자가없는 파일 .htaccess
등이 있습니다.
그것은 매우 성능이 뛰어나고 ""
점이 없거나 점 앞에 문자열이 없을 때 전체 문자열 대신 반환하여 구석 사건을 논란의 여지없이 더 잘 처리합니다 . 그것은 읽기 힘든 불구하고 매우 잘 만들어진 솔루션입니다. 도우미 라이브러리에 넣고 사용하십시오.
오래된 편집 :
확장명이없는 파일 또는 확장명이없는 숨겨진 파일 (위의 Tom의 답변에 대한 VisioN의 설명 참조)을 실행하려는 경우 더 안전한 구현은 이러한 행을 따라야합니다.
var a = filename.split(".");
if( a.length === 1 || ( a[0] === "" && a.length === 2 ) ) {
return "";
}
return a.pop(); // feel free to tack .toLowerCase() here if you want
a.length
하나 인 경우 확장자가없는 가시적 인 파일입니다. 파일
만약 a[0] === ""
그리고 a.length === 2
그것은 확장자의 예와 숨겨진 파일입니다. .htaccess
좀 더 복잡한 경우의 문제를 해결하는 데 도움이되기를 바랍니다. 성능면 에서이 솔루션은 대부분의 브라우저에서 정규식보다 약간 느립니다 . 그러나 가장 일반적인 목적으로이 코드를 완벽하게 사용할 수 있어야합니다.
답변
다음 솔루션은 신속 하고 짧은 대량 작업과 추가 바이트 저장 사용하기에 충분한 :
return fname.slice((fname.lastIndexOf(".") - 1 >>> 0) + 2);
다음은 한 줄 비정규 범용 솔루션입니다.
return fname.slice((Math.max(0, fname.lastIndexOf(".")) || Infinity) + 1);
둘 다 확장자가 없거나 (예 : myfile ) .
점으로 시작 하는 이름 (예 : .htaccess )에서 올바르게 작동합니다 .
"" --> ""
"name" --> ""
"name.txt" --> "txt"
".htpasswd" --> ""
"name.with.many.dots.myext" --> "myext"
속도에 관심이 있다면 벤치 마크를 실행 하고 제공된 솔루션이 가장 빠른 반면 짧은 솔루션이 엄청 빠른지 확인할 수 있습니다.
짧은 것이 작동하는 방법 :
String.lastIndexOf
메소드는"."
주어진 문자열 (iefname
) 에서 부분 문자열 (ie ) 의 마지막 위치를 반환합니다 . 부분 문자열을 찾지 못하면 메소드가를 반환합니다-1
.- 파일 이름에서 점의 “허용 할 수없는”위치는
-1
및0
이며 각각 확장자가없는"name"
이름 (예 :)과 점으로 시작하는 이름 (예 :)을 나타".htaccess"
냅니다. - 제로 채우기 오른쪽 이동 연산자 (
>>>
)가 0과 함께 사용되면 and 로 변환-1
되는 음수에 영향을 미치며 ,이 경우 파일 이름이 엣지 케이스에서 변경되지 않은 상태로 유지하는 데 유용합니다 (여기에서 트릭 정렬).4294967295
-2
4294967294
String.prototype.slice
설명 된대로 계산 된 위치에서 파일 이름의 일부를 추출합니다. 위치 번호가 문자열 길이보다 길면를 반환합니다""
.
동일한 방식으로 작동하고 (전체 경로를 추가로 지원하는)보다 명확한 솔루션을 원하는 경우 다음 확장 버전을 확인하십시오. 이 솔루션은 이전의 1- 라이너보다 느리지 만 이해하기는 훨씬 쉽습니다.
function getExtension(path) {
var basename = path.split(/[\\/]/).pop(), // extract file name from full path ...
// (supports `\\` and `/` separators)
pos = basename.lastIndexOf("."); // get last position of `.`
if (basename === "" || pos < 1) // if file name is empty or ...
return ""; // `.` not found (-1) or comes first (0)
return basename.slice(pos + 1); // extract extension ignoring `.`
}
console.log( getExtension("/path/to/file.ext") );
// >> "ext"
세 가지 변형 모두 클라이언트 측의 모든 웹 브라우저에서 작동해야하며 서버 측 NodeJS 코드에서도 사용될 수 있습니다.
답변
function getFileExtension(filename)
{
var ext = /^.+\.([^.]+)$/.exec(filename);
return ext == null ? "" : ext[1];
}
테스트
"a.b" (=> "b")
"a" (=> "")
".hidden" (=> "")
"" (=> "")
null (=> "")
또한
"a.b.c.d" (=> "d")
".a.b" (=> "b")
"a..b" (=> "b")
답변
function getExt(filename)
{
var ext = filename.split('.').pop();
if(ext == filename) return "";
return ext;
}
답변
var extension = fileName.substring(fileName.lastIndexOf('.')+1);
답변
var parts = filename.split('.');
return parts[parts.length-1];