[javascript] JavaScript로 파일 확장자를 얻으려면 어떻게해야합니까?

코드보기 :

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"

속도에 관심이 있다면 벤치 마크를 실행 하고 제공된 솔루션이 가장 빠른 반면 짧은 솔루션이 엄청 빠른지 확인할 수 있습니다.

속도 비교

짧은 것이 작동하는 방법 :

  1. String.lastIndexOf메소드는 "."주어진 문자열 (ie fname) 에서 부분 문자열 (ie ) 의 마지막 위치를 반환합니다 . 부분 문자열을 찾지 못하면 메소드가를 반환합니다 -1.
  2. 파일 이름에서 점의 “허용 할 수없는”위치는 -10이며 각각 확장자가없는 "name"이름 (예 :)과 점으로 시작하는 이름 (예 :)을 나타 ".htaccess"냅니다.
  3. 제로 채우기 오른쪽 이동 연산자 ( >>>)가 0과 함께 사용되면 and 로 변환 -1되는 음수에 영향을 미치며 ,이 경우 파일 이름이 엣지 케이스에서 변경되지 않은 상태로 유지하는 데 유용합니다 (여기에서 트릭 정렬).4294967295-24294967294
  4. 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];