web-dev-qa-db-ja.com

JavaScriptで文字列からファイル拡張子を削除する方法

例えばx = filename.jpgと仮定すると、filenameを取得したいと思います。ここでfilenameは任意のファイル名にすることができます(簡単にするためにファイル名には[a-zA-Z0-9-_]しか含まれていません)。

私はx.substring(0, x.indexOf('.jpg'))DZone Snippets で見ましたが、x.substring(0, x.length-4)のほうがパフォーマンスが良くないでしょうか?なぜなら、lengthはプロパティであり、文字チェックをしないのに対して、indexOf()は関数であり文字チェックをするからです。

245
ma11hew28

拡張子の長さがわかっている場合は、x.slice(0, -4)を使用できます(4は拡張子とドットの3文字です)。

@John Hartsockの正規表現の長さがわからない場合は、正しい方法です。

正規表現を使用したくない場合は、これを試すことができます(パフォーマンスが低下します)。

filename.split('.').slice(0, -1).join('.')

拡張子のないファイルでは失敗することに注意してください。

129
Marek Sapota

何がより速く実行されるかわからないが、これは.jpeg.htmlのような拡張子に関してはより信頼できるでしょう。

x.replace(/\.[^/.]+$/, "")
399
John Hartsock

node.jsでは、拡張子を除いたファイル名は次のようにして取得できます。

const path = require('path');
var filename = 'hello.html';

path.parse(filename).name; // hello
path.parse(filename).ext;  // .html

Node.jsドキュメント ページでさらなる説明。

167
Jibesh Patra

x.length-4は3文字の拡張子のみを占めます。 filename.jpegまたはfilename.plがある場合はどうなりますか?

編集:

答えるために...確かに、あなたがいつも.jpgの拡張子を持っていれば、x.length-4はうまく動くでしょう。

しかしながら、あなたがあなたの拡張の長さを知らないならば、多くの解決策のどれもがより良い/より堅牢です。

x = x.replace(/\..+$/, '');

OR

x = x.substring(0, x.lastIndexOf('.'));

OR

x = x.replace(/(.*)\.(.*?)$/, "$1");

OR(ファイル名はドットが1つしかないと仮定して)

parts = x.match(/[^\.]+/);
x = parts[0];

OR(1ドットのみ)

parts = x.split(".");
x = parts[0];
111
Jeff B

最後のドットが拡張子の区切り文字になるという仮定を使用することができます。

var x = 'filename.jpg';
var f = x.substr(0, x.lastIndexOf('.'));

ファイルに拡張子がない場合は、空の文字列を返します。これを直すにはこの関数を使います

function removeExtension(filename){
    var lastDotPosition = filename.lastIndexOf(".");
    if (lastDotPosition === -1) return filename;
    else return filename.substr(0, lastDotPosition);
}
37
Martin Algesten

0.12.xより前のNode.jsバージョンでは、次のようになります。

path.basename(filename, path.extname(filename))

もちろん、これは0.12.x以降でも機能します。

13
blah238

これは、区切り文字が文字列に存在しない場合でも機能します。

String.prototype.beforeLastIndex = function (delimiter) {
    return this.split(delimiter).slice(0,-1).join(delimiter) || this + ""
}

"image".beforeLastIndex(".") // "image"
"image.jpeg".beforeLastIndex(".") // "image"
"image.second.jpeg".beforeLastIndex(".") // "image.second"
"image.second.third.jpeg".beforeLastIndex(".") // "image.second.third"

このようなワンライナーとしても使用できます。

var filename = "this.is.a.filename.txt";
console.log(filename.split(".").slice(0,-1).join(".") || filename + "");

編集:これはより効率的な解決策です:

String.prototype.beforeLastIndex = function (delimiter) {
    return this.substr(0,this.lastIndexOf(delimiter)) || this + ""
}
11
Andrew Plank

それが読むのが難しくない1ライナーであるので、私はこれが好きです:

filename.substring(0, filename.lastIndexOf('.')) || filename
8
Jakub

有効なオプションかどうかはわかりませんが、これを使用します。

name = filename.split(".");
// trimming with pop()
name.pop();
// getting the name with join()
name.join('.'); // we split by '.' and we join by '.' to restore other eventual points.

それは私が知っている1つの操作だけではありませんが、少なくともそれは常にうまくいくはずです!

更新:あなたがonelinerが欲しいなら、ここにあなたは:

(name.split('.').slice(0, -1)).join('.')

7

もう一つのワンライナー:

x.split(".").slice(0, -1).join(".")
7
Jacob Bundgaard

これは別の正規表現ベースの解決策です:

filename.replace(/\.[^.$]+$/, '');

これは最後のセグメントを切り落とすだけです。

6
Chad Johnson

これは、basenameおよびextnameメソッドを使用してpathを使用しても簡単に実行できます。

const path = require('path')

path.basename('test.txt', path.extname('test.txt'))
6
DBrown

受け入れられた答えは最後の拡張部分(.jpeg)だけを取り除きます、それはほとんどの場合良い選択かもしれません。

私はかつてすべての拡張子(.tar.gz)を削除しなければならず、ファイル名はドットを含まないように制限されていました(2015-01-01.backup.tarは問題にならないでしょう)。

var name = "2015-01-01_backup.tar.gz";
name.replace(/(\.[^/.]+)+$/, "");
5
basic6

簡単なもの

var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;
5
Dugh

完全なパス(例:thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg")を含む変数を処理する必要があり、単に "filename"を返したい場合は、次のようにします。

theName = thePath.split("/").slice(-1).join().split(".").shift();

結果はtheName == "filename"になります。

試してみるには、クロムデバッガのコンソールウィンドウに次のコマンドを書いてください。window.location.pathname.split("/").slice(-1).join().split(".").shift()

ファイル名とその拡張子だけを処理する必要がある場合(例:theNameWithExt = "filename.jpg"

theName = theNameWithExt.split(".").shift();

結果はtheName == "filename"となり、上記と同じです。

ノート:

  1. 最初のものは少し遅い原因でより多くの操作を実行します。しかし、どちらの場合でも機能します。言い換えると、exを含むパスまたはファイル名を含む文字列から拡張子なしでファイル名を抽出することができます。 2番目のものは与えられた変数がfilename.extのようなextを持つファイル名を含んでいる場合にのみうまくいきますが、少し速いです。
  2. どちらのソリューションも、ローカルファイルとサーバーファイルの両方で機能します。

しかし、私は他の答えとのパフォーマンスの比較もブラウザやOSの互換性についても何も言うことはできません。

作業コード1:完全なパス

var thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg";
theName = thePath.split("/").slice(-1).join().split(".").shift();
alert(theName);

作業の断片2:拡張子付きのファイル名

var theNameWithExt = "filename.jpg";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);

ワーキングスニペット2:二重拡張子を持つファイル名

var theNameWithExt = "filename.tar.gz";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);
3
willy wonka

かなり遅れていますが、私は拡張子のないファイル名を取得するために別のアプローチを追加します。

path.replace(path.substr(path.lastIndexOf('.')), '')

2
Munim Dibosh
var fileName = "something.extension";
fileName.slice(0, -path.extname(fileName).length) // === "something"
2
Yas

これが正規表現が便利になるところです! Javascriptの.replace()メソッドは正規表現を取ります、そしてあなたはそれを利用してあなたが望むものを達成することができます:

// assuming var x = filename.jpg or some extension
x = x.replace(/(.*)\.[^.]+$/, "$1");
0
Alex
x.slice(0, -(x.split('.').pop().length + 1));
0
ishandutta2007

pathを使って操作することができます。

var MYPATH = '/User/HELLO/WORLD/FILENAME.js';
var MYEXT = '.js';
var fileName = path.basename(MYPATH, MYEXT);
var filePath = path.dirname(MYPATH) + '/' + fileName;

出力

> filePath
'/User/HELLO/WORLD/FILENAME'
> fileName
'FILENAME'
> MYPATH
'/User/HELLO/WORLD/FILENAME.js'
0
Alan Dong

もう1つの裏付け - ファイルはjpgの写真であると思います>> ex:var yourStr = 'test.jpg';

    yourStr = yourStr.slice(0, -4); // 'test'
0
SorinN

これは、正規表現もindexOfも使わずに、ファイル名から拡張子を削除するために使うコードです(indexOfはIE 8ではサポートされていません)。拡張子は最後の '。'以降のテキストであると仮定します。キャラクター。

それは働きます:

  • 拡張子のないファイル: "myletter"
  • 「。」の付いたファイル名前の中に: "my.letter.txt"
  • ファイル拡張子の長さが不明: "my.letter.html"

これがコードです:

var filename = "my.letter.txt" // some filename

var substrings = filename.split('.'); // split the string at '.'
if (substrings.length == 1)
{
  return filename; // there was no file extension, file was something like 'myfile'
}
else
{
  var ext = substrings.pop(); // remove the last element
  var name = substrings.join(""); // rejoin the remaining elements without separator
  name = ([name, ext]).join("."); // readd the extension
  return name;
}
0
Little Brain