コードを参照してください:
var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc
function getFileExtension(filename) {
/*TODO*/
}
コードを参照してください:
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
etc が含まれる)でより適切に処理されるコーナーケースがいくつかあります。
これは非常にパフォーマンスが高く、""
ドットがない場合、またはドットの前に文字列がない場合、完全な文字列の代わりに返すことにより、間違いなくより良い方法でコーナー ケースを処理します。読むのは難しいですが、非常によくできたソリューションです。ヘルパーライブラリに貼り付けて、そのまま使用してください。
古い編集:
拡張子のないファイル、または拡張子のない隠しファイル (上記の 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
これにより、少し複雑なケースの問題が解消されるはずです。パフォーマンスに関しては、このソリューションはほとんどのブラウザーで正規表現よりも少し遅いと思います。ただし、ほとんどの一般的な目的では、このコードは完全に使用できるはずです。
次のソリューションは、一括操作で使用して余分なバイトを節約するのに十分高速で短いです。
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"
速度が気になる場合は、ベンチマークを実行して、提供されているソリューションが最速であるのに対し、短いソリューションが非常に高速であることを確認してください。
短いものの仕組み:
String.lastIndexOf
メソッドは"."
、指定された文字列 (つまり ) 内の部分文字列 (つまり )の最後の位置を返しますfname
。部分文字列が見つからない場合、メソッドは を返します-1
。-1
とで、それぞれ拡張子のない名前 (例: ) とドットで始まる名前(例: )0
を指します。"name"
".htaccess"
>>>
負の数に影響します。-1
4294967295
-2
4294967294
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 コードでも使用できます。
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];
function file_get_ext(filename)
{
return typeof filename != "undefined" ? filename.substring(filename.lastIndexOf(".")+1, filename.length).toLowerCase() : false;
}
// 获取文件后缀名
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"));
これを共有したかっただけです。
fileName.slice(fileName.lastIndexOf('.'))
ただし、拡張子のないファイルは最後の文字列を返すという欠点があります。しかし、そうすれば、これですべてが修正されます:
function getExtention(fileName){
var i = fileName.lastIndexOf('.');
if(i === -1 ) return false;
return fileName.slice(i)
}
"ワンライナー" を使用してファイル名と拡張子を取得し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"
// }
特定の拡張子を探していて、その長さがわかっている場合は、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
これを試して:
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;
}
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
ファイル (拡張子なし)
ファイル。(拡張子なし)
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;
}
ほとんどのアプリケーションでは、次のような単純なスクリプト
return /[^.]+$/.exec(filename);
問題なく動作します (Tom の提供による)。ただし、これはばかげた証拠ではありません。次のファイル名が指定されている場合は機能しません。
image.jpg?foo=bar
少しやり過ぎかもしれませんが、予測できないファイル名による失敗を避けるために、このような URL パーサーを使用することをお勧めします。
その特定の関数を使用すると、次のようなファイル名を取得できます。
var trueFileName = parse_url('image.jpg?foo=bar').file;
これにより、url 変数なしで「image.jpg」が出力されます。その後、ファイル拡張子を自由に取得できます。
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");
}
}
私はパーティーに何ヶ月も遅れていますが、簡単にするためにこのようなものを使用します
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>
return filename.replace(/\.([a-zA-Z0-9]+)$/, "$1");
編集: 奇妙なことに (またはそうではないかもしれません) $1
、replace メソッドの 2 番目の引数が機能していないようです... 申し訳ありません。
トムの答えは明らかに問題を解決しますが、p4bl0の答えにコメントを付けるだけでは十分ではないことに気付きました:
return filename.replace(/^.*?\.([a-zA-Z0-9]+)$/, "$1");
クエリ パラメータと 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
Wallacer の回答は素晴らしいですが、もう 1 つチェックが必要です。
ファイルに拡張子がない場合、ファイル名を拡張子として使用しますが、これは適切ではありません。
これを試してください:
return ( filename.indexOf('.') > 0 ) ? filename.split('.').pop().toLowerCase() : 'undefined';
node.js では、これは次のコードで実現できます。
var file1 ="50.xsl";
var path = require('path');
console.log(path.parse(file1).name);
var filetypeArray = (file.type).split("/");
var filetype = filetypeArray[1];
これはより良いアプローチです。