507 Stimmen

Wie schneidet man eine Dateierweiterung aus einem String in JavaScript ab?

Zum Beispiel, wenn man annimmt, dass x = filename.jpg Ich möchte eine filename , donde filename kann ein beliebiger Dateiname sein (nehmen wir zur Vereinfachung an, dass der Dateiname nur [a-zA-Z0-9-_] enthält).

Ich sah x.substring(0, x.indexOf('.jpg')) en DZone Schnipsel würde aber nicht x.substring(0, x.length-4) besser abschneiden? Darum, length ist eine Eigenschaft und führt keine Zeichenprüfung durch, während indexOf() ist eine Funktion und führt eine Zeichenprüfung durch.

53voto

Martin Algesten Punkte 12167

Sie können vielleicht davon ausgehen, dass der letzte Punkt das Trennzeichen für die Erweiterung ist.

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

Wenn die Datei keine Erweiterung hat, wird ein leerer String zurückgegeben. Um dies zu beheben, verwenden Sie diese Funktion

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

23voto

blah238 Punkte 1706

In Node.js-Versionen vor 0.12.x:

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

Natürlich funktioniert dies auch in 0.12.x und später.

16voto

Giacomo Cerquone Punkte 2152

Ich weiß nicht, ob es eine gültige Option ist, aber ich verwende diese:

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.

Ich weiß, es ist nicht nur ein Vorgang, aber zumindest sollte es immer funktionieren!

UPDATE: Wenn Sie einen Oneliner wollen, hier ist er:

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

13voto

Andrew Plank Punkte 842

Dies funktioniert auch, wenn das Trennzeichen nicht in der Zeichenkette enthalten ist.

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"

Kann auch als Einzeiler wie dieser verwendet werden:

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

EDIT: Dies ist eine effizientere Lösung:

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

10voto

Jacob Bundgaard Punkte 871

Ein weiterer Einzeiler:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X