626

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

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

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

36 に答える 36

1028

新しい編集:この質問が最初に投稿されてから多くのことが変更されました-wallacerの改訂された回答とVisionの優れた内訳には、本当に良い情報がたくさんあります


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

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

私の古い答え:

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

やるべきです。

編集: PhiLhoのコメントに応じて、次のようなものを使用してください:

return (/[.]/.exec(filename)) ? /[^.]+$/.exec(filename) : undefined;
于 2008-10-10T11:18:02.933 に答える
997
return filename.split('.').pop();

編集:

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

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

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

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

古い編集:

拡張子のないファイル、または拡張子のない隠しファイル (上記の 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

が 1 の場合a.length、拡張子のない可視ファイルです。ファイル

拡張子のない隠しファイルの場合a[0] === ""、つまり. .htaccessa.length === 2

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

于 2009-07-29T22:12:08.347 に答える
349

次のソリューションは、一括操作で使用して余分なバイトを節約するのに十分高速短いです。

 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. ファイル名のドットの「受け入れられない」位置は-1とで、それぞれ拡張子のない名前 (例: ) とドットで始まる名前(例: )0を指します。"name"".htaccess"
  3. ゼロフィル右シフト演算子( ) をゼロと共に使用すると、 およびに変換する>>>負の数に影響します。-14294967295-24294967294
  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 コードでも使用できます。

于 2012-10-15T17:04:31.393 に答える
39
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")
于 2008-10-10T11:44:52.197 に答える
24
function getExt(filename)
{
    var ext = filename.split('.').pop();
    if(ext == filename) return "";
    return ext;
}
于 2011-10-26T20:45:28.130 に答える
17
var extension = fileName.substring(fileName.lastIndexOf('.')+1);
于 2011-11-23T17:23:37.713 に答える
8
var parts = filename.split('.');
return parts[parts.length-1];
于 2008-10-10T11:18:40.263 に答える
8
function file_get_ext(filename)
    {
    return typeof filename != "undefined" ? filename.substring(filename.lastIndexOf(".")+1, filename.length).toLowerCase() : false;
    }
于 2008-10-10T13:53:57.287 に答える
7

// 获取文件后缀名
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"));

于 2018-12-03T09:11:09.907 に答える
6

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

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

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

   function getExtention(fileName){
     var i = fileName.lastIndexOf('.');
     if(i === -1 ) return false;
     return fileName.slice(i)
   }
于 2013-10-04T16:08:09.530 に答える
5

"ワンライナー" を使用してファイル名と拡張子を取得し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"
// }
于 2018-10-29T14:51:19.167 に答える
4

特定の拡張子を探していて、その長さがわかっている場合は、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

于 2014-08-25T10:23:11.897 に答える
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;
}
于 2011-05-12T04:01:50.817 に答える
4
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')

常に拡張子の小文字を返すため、フィールド変更で確認できます。

file.JpEg

ファイル (拡張子なし)

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

于 2008-10-11T16:43:21.033 に答える
4

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

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;
}

于 2017-08-28T18:08:44.627 に答える
3

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

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

問題なく動作します (Tom の提供による)。ただし、これはばかげた証拠ではありません。次のファイル名が指定されている場合は機能しません。

image.jpg?foo=bar

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

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

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

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

于 2011-04-07T16:18:35.173 に答える
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");
  }
}
于 2009-01-16T12:41:00.807 に答える
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>

于 2015-07-04T18:19:50.563 に答える
3
return filename.replace(/\.([a-zA-Z0-9]+)$/, "$1");

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

于 2008-10-10T11:12:04.397 に答える
3

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

return filename.replace(/^.*?\.([a-zA-Z0-9]+)$/, "$1");
于 2008-10-10T14:14:10.833 に答える
3

クエリ パラメータと 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
于 2016-02-20T17:18:29.627 に答える
1

Wallacer の回答は素晴らしいですが、もう 1 つチェックが必要です。

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

これを試してください:

return ( filename.indexOf('.') > 0 ) ? filename.split('.').pop().toLowerCase() : 'undefined';
于 2013-03-06T02:24:06.323 に答える
0

node.js では、これは次のコードで実現できます。

var file1 ="50.xsl";
var path = require('path');
console.log(path.parse(file1).name);
于 2015-07-27T09:40:14.830 に答える
0
var filetypeArray = (file.type).split("/");
var filetype = filetypeArray[1];

これはより良いアプローチです。

于 2013-12-06T15:01:00.177 に答える