JavaScriptでファイル拡張子を取得するにはどうすればよいですか?


501

コードを参照してください:

var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc

function getFileExtension(filename) {
    /*TODO*/
}

回答:


796

新しい編集:この質問が最初に投稿されてから多くのことが変更されました- ワラサーの改訂された回答VisioNの優れた内訳には非常に良い情報がたくさんあります


編集:これが受け入れられた答えだからです。ワラサーの答えは確かにはるかに優れています:

return filename.split('.').pop();

私の古い答え:

return /[^.]+$/.exec(filename);

それを行う必要があります。

編集: PhiLhoのコメントに応じて、次のようなものを使用します。

return (/[.]/.exec(filename)) ? /[^.]+$/.exec(filename) : undefined;

1
正規表現を2回実行するのは高価ではありませんか?
Andrew Hedges

5
以下の高評価の回答の方がはるかに優れています。
fletom

2
残念ながら、両方のソリューションはfile.htaccessなどの名前では失敗します。
VisioN 2012年

3
すべての可能なケースは次のように処理されます:return filename.split( "。")。slice(1).pop()|| "";
JustAndrei 2014

1
@JustAndreiまだすべてではありません:)パスではなく純粋なファイル名(ベース名?)の場合、実用的な理由から、return filename.substring(0,1) === '.' ? '' : filename.split('.').slice(1).pop() || '';これは適切であると思い.fileます。それはあなたがそれをワンライナーとして維持したいのであれば、それは私の好みに少し面倒です。
クッカー2014年

833
return filename.split('.').pop();

複雑にしないでおく :)

編集:

これは、より効率的であると私が思う別の非正規表現ソリューションです:

return filename.substring(filename.lastIndexOf('.')+1, filename.length) || filename;

以下のVisioNの回答でより適切に処理されるいくつかのコーナーケースがあります。特に、拡張子のないファイル(.htaccessなど)があります。

これは非常にパフォーマンスが高く、""ドットがないか、ドットの前に文字列がない場合、完全な文字列の代わりに戻ることにより、間違いなくより良い方法でコーナーケースを処理します。読むのは難しいですが、非常に巧妙に作成されたソリューションです。あなたのヘルパーライブラリにそれを貼り付けて、それを使用してください。

古い編集:

拡張子のないファイル、または拡張子のない隠しファイル(上記のトムの回答に対する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

これが少し複雑なケースの問題を解決するのに役立つことを願っています。パフォーマンスの点ではこのソリューションはほとんどのブラウザーの正規表現より少し遅いと思います。ただし、最も一般的な目的では、このコードは完全に使用できるはずです。


4
パフォーマンスについてコメントすることはできませんが、これは確かにきれいに見えます!使っています。+1
pc1oad1etter

6
ただし、この場合、ファイル名はfilname.tes.test.jpgのようになります。出力を考慮してください。私はそれが間違っていることを願っています。
Fero

19
その場合、出力は "jpg"になります
wallacer

1
鮮やかさ!どうもありがとう。正規表現を使用しないソリューションを見るのは良いことです。私はこれをPHPで行いましたが、使用する関数は2つだけです。+1
ボジャングル2010

3
@wallacer:filename実際に拡張機能がない場合はどうなりますか?これは単にベースファイル名を返すだけではないのですか?
Nicol Bolas、2011年

287

次のソリューションは、バルク操作で使用して余分なバイトを節約するのに十分なほど高速かつ短時間です。

 return fname.slice((fname.lastIndexOf(".") - 1 >>> 0) + 2);

次に、正規表現以外の1行のユニバーサルソリューションを示します。

 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メソッドは、"."指定された文字列(つまり)内の部分文字列(つまり)の最後の位置を返しますfname。部分文字列が見つからない場合、メソッドはを返します-1
  2. ファイル名のドットの「許容できない」位置は-1and 0であり、それぞれ拡張子のない名前(たとえば"name")とドットで始まる名前(たとえば)を指し".htaccess"ます。
  3. ゼロで埋める右シフト演算子>>>)をゼロと一緒に使用-1する4294967295と、と-2に変換される負の数に影響します4294967294。これは、ファイル名を変更しない場合に便利です(ここではちょっとしたトリックです)。
  4. String.prototype.slice説明に従って計算された位置からファイル名の一部を抽出します。位置番号が文字列の長さよりも大きい場合、メソッドはを返します""

同じように機能する(さらにフルパスのサポートが追加された)より明確なソリューションが必要な場合は、次の拡張バージョンを確認してください。このソリューションは、以前のワンライナーより遅くなりますが、理解がはるかに簡単です。

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"

3つのバリアントはすべて、クライアント側の任意のWebブラウザーで機能し、サーバー側のNodeJSコードでも使用できます。


5
動作しません。「/home/user/.app/config」は「app / config」を返しますが、これは完全に間違っています。
mrbrdo 2013年

33
@mrbrdoこのメソッドは、質問で要求されているように、ファイル名のみでフルパスを処理することは想定されていません。投票する前に質問をよく読んでください。
VisioN 2013年

8
なぜそのような些細なコード行を最適化するために長さに行くのですか?チルダ演算子とビットシフト演算子がJavaScriptであまり見られないため、そのような答えをサポートできません。1行のコードがどのように機能するかを説明するのに5つの箇条書きが必要な場合は、実際に理解できるようにコードを書き直すことをお勧めします。
ジャクソン

6
この1本の線の速度は、どのアプリケーションでも認識できるほどの違いはありません。Bitwiseはめったに使用されないため、JSLintやJSHintなどの人気のあるリンターはそれらを使用しないよう警告します。このロジックのパフォーマンスとコンパクトさにこだわり、コードの品質を低下させています。コードに「追加の調査」が必要な場合は、「悪い」と見なします。
ジャクソン

10
@Jacksonこれが問題に対して複数のソリューションを提供するためのサイトであることを考慮すると、パフォーマンスを最適化するソリューションを持つことは決して悪いことではありません。あなたは、「どのアプリケーションでも認識できるほどの違いはありません」という記述は、これが使用される可能性のあるアプリケーションの狭い範囲に完全に基づいています。それ以上に、問題を調べている誰かに、最適化できる学習体験を提供することができます。彼らが書いている計算集中型アプリケーションのために作成する必要がある他のコード。
nrylee 2017年

33
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")

IEで機能させるには:var pattern = "^。+ \\。([^。] +)$"; var ext = new RegExp(pattern);
spc16670

20
function getExt(filename)
{
    var ext = filename.split('.').pop();
    if(ext == filename) return "";
    return ext;
}

8
return(ext === filename)?'':ext;
Michiel

13
var extension = fileName.substring(fileName.lastIndexOf('.')+1);


8
function file_get_ext(filename)
    {
    return typeof filename != "undefined" ? filename.substring(filename.lastIndexOf(".")+1, filename.length).toLowerCase() : false;
    }

8

コード

/**
 * Extract file extension from URL.
 * @param {String} url
 * @returns {String} File extension or empty string if no extension is present.
 */
var getFileExtension = function (url) {
    "use strict";
    if (url === null) {
        return "";
    }
    var index = url.lastIndexOf("/");
    if (index !== -1) {
        url = url.substring(index + 1); // Keep path without its segments
    }
    index = url.indexOf("?");
    if (index !== -1) {
        url = url.substring(0, index); // Remove query
    }
    index = url.indexOf("#");
    if (index !== -1) {
        url = url.substring(0, index); // Remove fragment
    }
    index = url.lastIndexOf(".");
    return index !== -1
        ? url.substring(index + 1) // Only keep file extension
        : ""; // No extension found
};

テスト

クエリがない場合でも、フラグメントがまだ存在している可能性があることに注意してください。

"https://www.example.com:8080/segment1/segment2/page.html?foo=bar#fragment" --> "html"
"https://www.example.com:8080/segment1/segment2/page.html#fragment"         --> "html"
"https://www.example.com:8080/segment1/segment2/.htaccess?foo=bar#fragment" --> "htaccess"
"https://www.example.com:8080/segment1/segment2/page?foo=bar#fragment"      --> ""
"https://www.example.com:8080/segment1/segment2/?foo=bar#fragment"          --> ""
""                                                                          --> ""
null                                                                        --> ""
"a.b.c.d"                                                                   --> "d"
".a.b"                                                                      --> "b"
".a.b."                                                                     --> ""
"a...b"                                                                     --> "b"
"..."                                                                       --> ""

JSLint

0警告。


7

高速でパスと正しく動作します

(filename.match(/[^\\\/]\.([^.\\\/]+)$/) || [null]).pop()

いくつかのエッジケース

/path/.htaccess => null
/dir.with.dot/file => null

splitを使用するソリューションは遅く、lastIndexOfを使用するソリューションはエッジケースを処理しません。


エッジケースとはどういう意味ですか?ここで私のソリューションを参照してください:stackoverflow.com/a/12900504/1249581。すべてのケースで正常に動作し、どの正規表現よりもはるかに高速です。
VisioN 2013年

エッジケースの一覧は既に記載しています。そして、あなたのソリューションはそれらを適切に処理しません。すでに書いたように、「/ dir.with.dot/file」を試してください。あなたのコードは、とんでもなく間違っている "dot / file"を返します。
mrbrdo 2013年

1
パスの解析を要求したユーザーはいません。問題はファイル名から拡張子を抽出することでした。
VisioN 2013年

3
すでにお話ししたように、これは明示的には言われていません。パスを処理するソリューションの方が明らかに便利です。SOに関する質問への回答は、質問した人以外の人にも役立つはずです。入力のスーパーセットを処理するソリューションは、反対票を投じるべきではないと私は本当に考えていません。
mrbrdo 2013年

3
反対票は、でグローバル変数を使用するためのものでした.exec()。あなたのコードはとして良くなります(filename.match(/[^\\/]\.([^\\/.]+)$/) || [null]).pop()
VisioN 2013年

6

これを共有したかっただけです。

fileName.slice(fileName.lastIndexOf('.'))

ただし、拡張子のないファイルは最後の文字列を返すという欠点があります。しかし、そうすることですべてが修正されます:

   function getExtention(fileName){
     var i = fileName.lastIndexOf('.');
     if(i === -1 ) return false;
     return fileName.slice(i)
   }

私が覚えている限り、sliceメソッドは文字列ではなく配列を指します。文字列substrまたはsubstring動作します。
VisioN 2013年

@VisioNしかし、私はあなたが知っているべきだと思いますString.prototype.slice、そしてArray.prototype.sliceそれで、それはちょっと両方の方法でちょっと方法のようです
フセイン・ナザール

1
ああ、そうです。あなたが正しいです。この方法を完全に忘れていました。私の悪い。
VisioN 2013年

5

誰かが将来私のコードを縮小したり最適化したりできるようにしてくれるでしょう。しかし、現在のところ、コードがすべての固有の状況(たとえば、ファイル名のみ相対ルート相対絶対 URL、フラグメント #タグ、クエリ ?文字列など)で機能することを200%確信しています。それ以外の場合は、完璧に、ピンポイントの精度でそれを投げることに決めるかもしれません。

証明については、https//projects.jamesandersonjr.com/web/js_projects/get_file_extension_test.phpにアクセスしてください。

これがJSFiddleです:https ://jsfiddle.net/JamesAndersonJr/ffcdd5z3/

自信過剰であるか、または自分自身のトランペットを吹いて、私は見ていないまでもありません任意の(発見、このタスクのためのコードのブロックを「正しい」異なるのバッテリーに囲まれ、ファイルの拡張子をfunction、これがそうであるようにも動作する入力引数)。

注:設計上、指定された入力文字列にファイル拡張子が存在しない場合""は、エラーやエラーメッセージではなく、単に空の文字列を返します。

これは2つの引数を取ります。

  • 文字列: fileNameOrURL (説明不要

  • ブール値: showUnixDotFiles(ドット「。」で始まるファイルを表示するかどうか)

注(2):私のコードが気に入った場合は、必ずjsライブラリまたはrepoに追加してくださいこれは、私がコードの完成に懸命に取り組んだため、無駄に費やすのは残念なことです。だから、これ以上面倒ではありませんが、ここにあります:

function getFileExtension(fileNameOrURL, showUnixDotFiles)
    {
        /* First, let's declare some preliminary variables we'll need later on. */
        var fileName;
        var fileExt;

        /* Now we'll create a hidden anchor ('a') element (Note: No need to append this element to the document). */
        var hiddenLink = document.createElement('a');

        /* Just for fun, we'll add a CSS attribute of [ style.display = "none" ]. Remember: You can never be too sure! */
        hiddenLink.style.display = "none";

        /* Set the 'href' attribute of the hidden link we just created, to the 'fileNameOrURL' argument received by this function. */
        hiddenLink.setAttribute('href', fileNameOrURL);

        /* Now, let's take advantage of the browser's built-in parser, to remove elements from the original 'fileNameOrURL' argument received by this function, without actually modifying our newly created hidden 'anchor' element.*/ 
        fileNameOrURL = fileNameOrURL.replace(hiddenLink.protocol, ""); /* First, let's strip out the protocol, if there is one. */
        fileNameOrURL = fileNameOrURL.replace(hiddenLink.hostname, ""); /* Now, we'll strip out the host-name (i.e. domain-name) if there is one. */
        fileNameOrURL = fileNameOrURL.replace(":" + hiddenLink.port, ""); /* Now finally, we'll strip out the port number, if there is one (Kinda overkill though ;-)). */  

        /* Now, we're ready to finish processing the 'fileNameOrURL' variable by removing unnecessary parts, to isolate the file name. */

        /* Operations for working with [relative, root-relative, and absolute] URL's ONLY [BEGIN] */ 

        /* Break the possible URL at the [ '?' ] and take first part, to shave of the entire query string ( everything after the '?'), if it exist. */
        fileNameOrURL = fileNameOrURL.split('?')[0];

        /* Sometimes URL's don't have query's, but DO have a fragment [ # ](i.e 'reference anchor'), so we should also do the same for the fragment tag [ # ]. */
        fileNameOrURL = fileNameOrURL.split('#')[0];

        /* Now that we have just the URL 'ALONE', Let's remove everything to the last slash in URL, to isolate the file name. */
        fileNameOrURL = fileNameOrURL.substr(1 + fileNameOrURL.lastIndexOf("/"));

        /* Operations for working with [relative, root-relative, and absolute] URL's ONLY [END] */ 

        /* Now, 'fileNameOrURL' should just be 'fileName' */
        fileName = fileNameOrURL;

        /* Now, we check if we should show UNIX dot-files, or not. This should be either 'true' or 'false'. */  
        if ( showUnixDotFiles == false )
            {
                /* If not ('false'), we should check if the filename starts with a period (indicating it's a UNIX dot-file). */
                if ( fileName.startsWith(".") )
                    {
                        /* If so, we return a blank string to the function caller. Our job here, is done! */
                        return "";
                    };
            };

        /* Now, let's get everything after the period in the filename (i.e. the correct 'file extension'). */
        fileExt = fileName.substr(1 + fileName.lastIndexOf("."));

        /* Now that we've discovered the correct file extension, let's return it to the function caller. */
        return fileExt;
    };

楽しい!どういたしまして!:


1
驚くばかり。ありがとう!
GollyJer 2018年

5

// 获取文件后缀名
function getFileExtension(file) {
  var regexp = /\.([0-9a-z]+)(?:[\?#]|$)/i;
  var extension = file.match(regexp);
  return extension && extension[1];
}

console.log(getFileExtension("https://www.example.com:8080/path/name/foo"));
console.log(getFileExtension("https://www.example.com:8080/path/name/foo.BAR"));
console.log(getFileExtension("https://www.example.com:8080/path/name/.quz/foo.bar?key=value#fragment"));
console.log(getFileExtension("https://www.example.com:8080/path/name/.quz.bar?key=value#fragment"));


5

WebのURLを扱っている場合は、以下を使用できます。

function getExt(filepath){
     return filepath.split("?")[0].split("#")[0].split('.').pop();
}

getExt("../js/logic.v2.min.js") // js
getExt("http://example.net/site/page.php?id=16548") // php
getExt("http://example.net/site/page.html#welcome.to.me") // html
getExt("c:\\logs\\yesterday.log"); // log

デモ:https : //jsfiddle.net/squadjot/q5ard4fj/


私はあなたのソリューションが本当に好きです。ほんの少しで多くのことができます。使用します。
Jules Manson

4

これを試して:

function getFileExtension(filename) {
  var fileinput = document.getElementById(filename);
  if (!fileinput)
    return "";
  var filename = fileinput.value;
  if (filename.length == 0)
    return "";
  var dot = filename.lastIndexOf(".");
  if (dot == -1)
    return "";
  var extension = filename.substr(dot, filename.length);
  return extension;
}

3
return filename.replace(/\.([a-zA-Z0-9]+)$/, "$1");

編集:奇妙なことに(または多分そうではないかもしれませんが)$1、replaceメソッドの2番目の引数は機能していないようです...申し訳ありません。


1
それは完璧に動作しますが、文字列の他のすべてのコンテンツを削除する必要があることを逃しました:return filename.replace(/^.*?\。([a-zA-Z0-9] +)$ /、 "$ 1");
2008年

3

トムの答えは問題を明確に解決しますが、p4bl0の答えにコメントを付けるだけでは十分ではないことに気づきました。

return filename.replace(/^.*?\.([a-zA-Z0-9]+)$/, "$1");

3

ほとんどのアプリケーションでは、次のような簡単なスクリプト

return /[^.]+$/.exec(filename);

(トムによって提供されるように)うまく動作します。しかし、これは絶対の証拠ではありません。次のファイル名が指定されている場合は機能しません。

image.jpg?foo=bar

少しやり過ぎかもしれませんが、予測できないファイル名による失敗を回避するために、このようなURLパーサーを使用することをお勧めします。

その特定の関数を使用すると、次のようなファイル名を取得できます。

var trueFileName = parse_url('image.jpg?foo=bar').file;

これは、URL変数なしで「image.jpg」を出力します。その後、ファイル拡張子を自由に取得できます。


3
function func() {
  var val = document.frm.filename.value;
  var arr = val.split(".");
  alert(arr[arr.length - 1]);
  var arr1 = val.split("\\");
  alert(arr1[arr1.length - 2]);
  if (arr[1] == "gif" || arr[1] == "bmp" || arr[1] == "jpeg") {
    alert("this is an image file ");
  } else {
    alert("this is not an image file");
  }
}

3
function extension(fname) {
  var pos = fname.lastIndexOf(".");
  var strlen = fname.length;
  if (pos != -1 && strlen != pos + 1) {
    var ext = fname.split(".");
    var len = ext.length;
    var extension = ext[len - 1].toLowerCase();
  } else {
    extension = "No extension found";
  }
  return extension;
}

//使用法

拡張子( 'file.jpeg')

常に拡張下位casを返すので、次のフィールド変更の動作を確認できます。

file.JpEg

ファイル(拡張子なし)

ファイル。(拡張子なし)


3

特定の拡張子を探していて、その長さがわかっている場合は、substrを使用できます

var file1 = "50.xsl";

if (file1.substr(-4) == '.xsl') {
  // do something
}

JavaScriptリファレンス: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr


1
美しさにはシンプルさが伴います。これは、最も賢く、よりエレガントで、より効率的な答えです。Windowsベースのシステムで拡張機能を取得するために、常にString.substr(-3)またはString.substr(-4)を使用しました。なぜ誰かが正規表現とクレイジーなループを使いたいのでしょうか。
asiby 2014

13
@asibyこの種のソリューションは、打ち上げ後に宇宙ロケットがクラッシュする主な理由です。
VisioN 2015年

3

私はパーティーに遅れている多くの月ですが、簡単にするために私はこのようなものを使います

var fileName = "I.Am.FileName.docx";
var nameLen = fileName.length;
var lastDotPos = fileName.lastIndexOf(".");
var fileNameSub = false;
if(lastDotPos === -1)
{
    fileNameSub = false;
}
else
{
    //Remove +1 if you want the "." left too
    fileNameSub = fileName.substr(lastDotPos + 1, nameLen);
}
document.getElementById("showInMe").innerHTML = fileNameSub;
<div id="showInMe"></div>


3

pathモジュールには、このための標準ライブラリ関数があります。

import path from 'path';

console.log(path.extname('abc.txt'));

出力:

。txt

したがって、フォーマットのみが必要な場合:

path.extname('abc.txt').slice(1) // 'txt'

拡張子がない場合、関数は空の文字列を返します。

path.extname('abc') // ''

Nodeを使用している場合pathは、組み込みです。ブラウザーをターゲットにしている場合、Webpackはpath実装をバンドルします。Webpackなしでブラウザーをターゲットにしている場合は、path-browserifyを手動で含めることができます。

文字列分割や正規表現を行う理由はありません。


誰がノードについて何か言いましたか?
Shannon Hochkins

分割または正規表現を使用していないため、あなたの引数は、プラグインが含まれるかのノードでアプリケーションをバンドルすることで、それは卑しいタスクのためのトップの答えは上だ
シャノンHochkins

@ShannonHochkinsほとんどの場合、とにかくこれらのものをセットアップします
sdgfsdh '26 / 09/26

@AndreiDraganescu私はそれが降順であることを意図していなかったので、それを下げました。
sdgfsdh

3

「ワンライナー」を使用してreduce、ファイル名と拡張子を取得し、配列を分解します。

var str = "filename.with_dot.png";
var [filename, extension] = str.split('.').reduce((acc, val, i, arr) => (i == arr.length - 1) ? [acc[0].substring(1), val] : [[acc[0], val].join('.')], [])

console.log({filename, extension});

より良いインデントで:

var str = "filename.with_dot.png";
var [filename, extension] = str.split('.')
   .reduce((acc, val, i, arr) => (i == arr.length - 1) 
       ? [acc[0].substring(1), val] 
       : [[acc[0], val].join('.')], [])


console.log({filename, extension});

// {
//   "filename": "filename.with_dot",
//   "extension": "png"
// }

これはIE 11では機能しません
Gokul Maha

IE 11の欠けているES7 +機能にbabel / typescript / polyfillsを使用できます
boehm_s

2

クエリパラメータとURLのすべての文字も考慮する1行のソリューション。

string.match(/(.*)\??/i).shift().replace(/\?.*/, '').split('.').pop()

// Example
// some.url.com/with.in/&ot.s/files/file.jpg?spec=1&.ext=jpg
// jpg

(1)ファイルに拡張子がない場合でも、ファイル名が返されます。(2) URLにフラグメントがあり、クエリがない場合(例:)page.html#fragment、これはファイル拡張子とフラグメントを返します。
ジャック

2

このシンプルなソリューション

function extension(filename) {
  var r = /.+\.(.+)$/.exec(filename);
  return r ? r[1] : null;
}

テスト

/* tests */
test('cat.gif', 'gif');
test('main.c', 'c');
test('file.with.multiple.dots.zip', 'zip');
test('.htaccess', null);
test('noextension.', null);
test('noextension', null);
test('', null);

// test utility function
function test(input, expect) {
  var result = extension(input);
  if (result === expect)
    console.log(result, input);
  else
    console.error(result, input);
}

function extension(filename) {
  var r = /.+\.(.+)$/.exec(filename);
  return r ? r[1] : null;
}


1

Wallacerの答えはいいですが、もう1つチェックが必要です。

ファイルに拡張子がない場合、ファイル名は拡張子として使用されますが、これは適切ではありません。

これを試してください:

return ( filename.indexOf('.') > 0 ) ? filename.split('.').pop().toLowerCase() : 'undefined';

1

一部のファイルには拡張子がない可能性があることを忘れないでください。

var parts = filename.split('.');
return (parts.length > 1) ? parts.pop() : '';

1
var file = "hello.txt";
var ext = (function(file, lio) { 
  return lio === -1 ? undefined : file.substring(lio+1); 
})(file, file.lastIndexOf("."));

// hello.txt -> txt
// hello.dolly.txt -> txt
// hello -> undefined
// .hello -> hello

1
fetchFileExtention(fileName) {
    return fileName.slice((fileName.lastIndexOf(".") - 1 >>> 0) + 2);
}

2
このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
Brett DeWoody 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.