回答:
新しい編集:この質問が最初に投稿されてから多くのことが変更されました- ワラサーの改訂された回答とVisioNの優れた内訳には非常に良い情報がたくさんあります
編集:これが受け入れられた答えだからです。ワラサーの答えは確かにはるかに優れています:
return filename.split('.').pop();
私の古い答え:
return /[^.]+$/.exec(filename);
それを行う必要があります。
編集: PhiLhoのコメントに応じて、次のようなものを使用します。
return (/[.]/.exec(filename)) ? /[^.]+$/.exec(filename) : undefined;
return filename.substring(0,1) === '.' ? '' : filename.split('.').slice(1).pop() || '';
これは適切であると思い.file
ます。それはあなたがそれをワンライナーとして維持したいのであれば、それは私の好みに少し面倒です。
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
これが少し複雑なケースの問題を解決するのに役立つことを願っています。パフォーマンスの点では、このソリューションはほとんどのブラウザーの正規表現より少し遅いと思います。ただし、最も一般的な目的では、このコードは完全に使用できるはずです。
filename
実際に拡張機能がない場合はどうなりますか?これは単にベースファイル名を返すだけではないのですか?
次のソリューションは、バルク操作で使用して余分なバイトを節約するのに十分なほど高速かつ短時間です。
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
and 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")
var parts = filename.split('.');
return parts[parts.length-1];
コード
/**
* 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警告。
高速でパスと正しく動作します
(filename.match(/[^\\\/]\.([^.\\\/]+)$/) || [null]).pop()
いくつかのエッジケース
/path/.htaccess => null
/dir.with.dot/file => null
splitを使用するソリューションは遅く、lastIndexOfを使用するソリューションはエッジケースを処理しません。
.exec()
。あなたのコードはとして良くなります(filename.match(/[^\\/]\.([^\\/.]+)$/) || [null]).pop()
。
これを共有したかっただけです。
fileName.slice(fileName.lastIndexOf('.'))
ただし、拡張子のないファイルは最後の文字列を返すという欠点があります。しかし、そうすることですべてが修正されます:
function getExtention(fileName){
var i = fileName.lastIndexOf('.');
if(i === -1 ) return false;
return fileName.slice(i)
}
slice
メソッドは文字列ではなく配列を指します。文字列substr
またはsubstring
動作します。
String.prototype.slice
、そしてArray.prototype.slice
それで、それはちょっと両方の方法でちょっと方法のようです
誰かが将来私のコードを縮小したり最適化したりできるようにしてくれるでしょう。しかし、現在のところ、コードがすべての固有の状況(たとえば、ファイル名のみ、相対、ルート相対、絶対 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;
};
楽しい!どういたしまして!:
// 获取文件后缀名
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"));
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
これを試して:
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;
}
ほとんどのアプリケーションでは、次のような簡単なスクリプト
return /[^.]+$/.exec(filename);
(トムによって提供されるように)うまく動作します。しかし、これは絶対の証拠ではありません。次のファイル名が指定されている場合は機能しません。
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");
}
}
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
ファイル(拡張子なし)
ファイル。(拡張子なし)
特定の拡張子を探していて、その長さがわかっている場合は、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
私はパーティーに遅れている多くの月ですが、簡単にするために私はこのようなものを使います
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>
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を手動で含めることができます。
文字列分割や正規表現を行う理由はありません。
「ワンライナー」を使用して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"
// }
クエリパラメータと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
page.html#fragment
、これはファイル拡張子とフラグメントを返します。
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;
}
fetchFileExtention(fileName) {
return fileName.slice((fileName.lastIndexOf(".") - 1 >>> 0) + 2);
}