Wie schneidet man eine Dateierweiterung von einem String in Javascript ab?

Angenommen, x = filename.jpg möchte ich beispielsweise filename , wobei filename ein beliebiger filename kann (angenommen, der Dateiname enthält zur Vereinfachung [a-zA-Z0-9-_].).

Ich habe x.substring(0, x.indexOf('.jpg')) in DZone-Snippets gesehen , konnte aber nicht x.substring(0, x.length-4) besser arbeiten? Weil length eine Eigenschaft ist und keine Zeichenprüfung durchführt, während indexOf() eine Funktion ist und Zeichenprüfung durchführt.

214
23 нояб. set ma11hew28 23. November 2010-11-23 00:24 '10 am 0:24 2010-11-23 00:24
@ 24 Antworten

Wenn Sie die Länge der Erweiterung kennen, können Sie x.slice(0, -4) (wobei 4 die drei Zeichen der Erweiterung und ein Punkt ist).

Wenn Sie die Länge nicht kennen, wäre der reguläre Ausdruck von @John Hartsock der richtige Ansatz.

Wenn Sie keine regulären Ausdrücke verwenden möchten, können Sie dies (weniger effizient) versuchen:

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

Bitte beachten Sie, dass dies nicht für Dateien ohne eine Erweiterung funktioniert.

103
23 нояб. Die Antwort wird von Marek Sapota am 23. November gegeben 2010-11-23 00:29 '10 am 0:29 2010-11-23 00:29

Nicht sicher, dass es schneller funktioniert, aber es ist zuverlässiger, wenn es um Erweiterungen geht, beispielsweise .jpeg oder .html

border=0
 x.replace(/\.[^/.]+$/, "") 
361
23 нояб. Antwort von John Hartsock am 23. November 2010-11-23 00:29 '10 am 0:29 2010-11-23 00:29

In der Datei node.js kann der Dateiname ohne die Erweiterung wie folgt ermittelt werden.

 const path = require('path'); var filename = 'hello.html'; path.parse(filename).name; // hello path.parse(filename).ext; // .html 

Weitere Erläuterungen auf der Dokumentationsseite zu Node.js.

126
24 июля '15 в 19:43 2015-07-24 19:43 Die Antwort gibt Jibesh Patra am 24. Juli 15 um 19:43 Uhr 2015-07-24 19:43

x.length-4 berücksichtigt nur Erweiterungen von 3 Zeichen. Was ist, wenn Sie filename.jpeg oder filename.pl ?

BEARBEITEN:

Um zu antworten ... natürlich, wenn Sie immer die Erweiterung .jpg , x.length-4 gut.

Wenn Sie jedoch die Länge Ihrer Erweiterung nicht kennen, ist eine von mehreren Lösungen besser / sicherer.

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

Oder

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

Oder

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

ODER (mit der Annahme, dass der Dateiname nur einen Punkt hat)

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

ODER (auch mit einem Punkt)

 parts = x.split("."); x = parts[0]; 
107
23 нояб. Antwort von Jeff B am 23. November 2010-11-23 00:28 '10 am 0:28 2010-11-23 00:28

Vielleicht können Sie davon ausgehen, dass der letzte Punkt ein Expander sein wird.

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

Wenn die Datei keine Erweiterung hat, wird eine leere Zeichenfolge 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); } 
35
23 нояб. Antwort von Martin Algesten am 23. November 2010-11-23 00:30 '10 am 0:30 2010-11-23 00:30

In Versionen von Node.js bis 0.12.x:

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

Das funktioniert natürlich auch in 0.12.x und später.

13
16 дек. die antwort wird gegeben blah238 16 dez. 2015-12-16 03:01 '15 am 3:01 2015-12-16 03:01

Dies funktioniert auch, wenn das Trennzeichen nicht in der Zeichenfolge 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 einzelne Zeile verwendet werden:

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

EDIT: Dies ist eine effektivere Lösung:

 String.prototype.beforeLastIndex = function (delimiter) { return this.substr(0,this.lastIndexOf(delimiter)) || this + "" } 
11
17 сент. Die Antwort wird von Andrew Plank am 17. September gegeben. 2014-09-17 15:15 14 am 15:15 2014-09-17 15:15

Ich mag dieses, weil es ein einziger Liner ist, der nicht zu schwer zu lesen ist:

 filename.substring(0, filename.lastIndexOf('.')) || filename 
7
24 дек. Die Antwort wird von Jakub 24. Dezember gegeben. 2017-12-24 02:09 '17 am 02:09 2017-12-24 02:09

Andere einzelne Zeile:

 x.split(".").slice(0, -1).join(".") 
7
08 янв. Die Antwort gibt Jacob Bundgaard vom 08. Januar 2014-01-08 15:10 14 am 15:10 2014-01-08 15:10

Hier ist eine weitere Lösung für reguläre Ausdrücke:

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

Dies sollte nur das letzte Segment abschneiden.

6
30 янв. Antwort von Chad Johnson am 30. Januar 2015-01-30 01:25 15 um 01.25 Uhr 2015-01-30 01.25 Uhr

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

 name = filename.split("."); // trimming with pop() name.pop(); // getting the name with join() name.join(''); // empty string since default separator is ', ' 

Dies ist nicht nur eine Operation, die ich kenne, aber es sollte immer funktionieren!

6
29 нояб. Antwort von Giacomo Cerquone 29. November 2015-11-29 23:44 '15 um 23:44 Uhr 2015-11-29 23:44

Einfach:

 var n = str.lastIndexOf("."); return n > -1 ? str.substr(0, n) : str; 
5
21 июня '16 в 10:59 2016-06-21 10:59 Die Antwort wird von Dugh am 21. Juni '16 um 10:59 2016-06-21 10:59 gegeben

Die akzeptierte Antwort lässt nur den letzten Teil der Erweiterung ( .jpeg ) zu, was in den meisten Fällen eine gute Wahl sein kann.

Ich musste alle Erweiterungen ( .tar.gz ) entfernen, und die Dateinamen waren begrenzt, um keine Punkte zu enthalten (daher wäre 2015-01-01.backup.tar kein Problem):

 var name = "2015-01-01_backup.tar.gz"; name.replace(/(\.[^/.]+)+$/, ""); 
4
14 февр. Die Antwort wird von basic6 14 Feb. gegeben. 2015-02-14 23:06 '15 um 23:06 Uhr 2015-02-14 23:06

Wenn Sie eine Variable thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg" müssen, die einen vollständigen Pfad enthält (zum Beispiel: thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg" ) und Sie nur den "Dateinamen" zurückgeben möchten, können Sie thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg" verwenden:

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

Das Ergebnis ist derName == "Dateiname" ;

Versuchen Sie, den folgenden Befehl in Ihr Chrome-Debugger-Konsolenfenster zu window.location.pathname.split("/").slice(-1).join().split(".").shift() : window.location.pathname.split("/").slice(-1).join().split(".").shift()

Wenn Sie nur den Dateinamen und seine Erweiterung theNameWithExt = "filename.jpg" (zum Beispiel: theNameWithExt = "filename.jpg" ):

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

Das Ergebnis ist derName == "Dateiname" , wie oben;

Anmerkungen:

  • Die erste ist etwas >
  • Beide Lösungen funktionieren sowohl für lokale als auch für Serverdateien.

Zum gleichen Leistungsvergleich mit anderen Antworten sowie zur Kompatibilität mit Browser und Betriebssystem kann ich jedoch nichts sagen.

Arbeiterfragment 1: vollständiger Pfad

  

Arbeitsfragment 2: Dateiname mit Erweiterung

  

Arbeitsfragment 2: Dateiname mit doppelter Erweiterung

  
3
12 окт. Antwort gegeben willy wonka 12. Oktober 2016-10-12 18:04 16 um 18:04 Uhr 2016-10-12 18:04

Dies kann auch problemlos mit path mit den Methoden basename und extname durchgeführt werden.

 const path = require('path') path.basename('test.txt', path.extname('test.txt')) 
3
06 нояб. Die Antwort ist DBrown Nov. 06 gegeben 2018-11-06 05:23 '18 um 05:23 Uhr 2018-11-06 05:23

Obwohl es bereits ziemlich spät ist, werde ich einen anderen Ansatz hinzufügen, um den Dateinamen ohne Erweiterung zu erhalten.

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

2
05 апр. Antwort von Munim Dibosh am 5. April 2018-04-05 19:50 '18 um 19:50 Uhr 2018-04-05 19:50
 var fileName = "something.extension"; fileName.slice(0, -path.extname(fileName).length) // === "something" 
2
19 марта '16 в 10:40 2016-03-19 10:40 Die Antwort ist gegeben am 19. März 16 um 10:40 Uhr 2016-03-19 10:40

Dies ist der Code, den ich verwende, um die Erweiterung aus dem Dateinamen zu entfernen, ohne reguläre Ausdrücke oder indexOf zu verwenden (indexOf wird in IE8 nicht unterstützt). Er geht davon aus, dass es sich bei der Erweiterung um einen beliebigen Text nach dem letzten '.' Zeichen

Es funktioniert für:

  • Dateien ohne Dateiendung: "myletter"
  • Dateien mit. im Titel: "my.letter.txt"
  • unbekannte Dateierweiterungslänge: "my.letter.html"

Hier ist der Code:

 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
11 нояб. Die Antwort wird am 11. November von Little Brain gegeben. 2015-11-11 14:45 '15 am 14:45 2015-11-11 14:45
 x.slice(0, -(x.split('.').pop().length + 1)); 
0
25 нояб. die antwort wird gegeben ishandutta2007 25 nov. 2017-11-25 16:08 17 um 16:08 2017-11-25 16:08

Sie können den path zum Manövrieren verwenden.

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

Beenden

 > filePath '/User/HELLO/WORLD/FILENAME' > fileName 'FILENAME' > MYPATH '/User/HELLO/WORLD/FILENAME.js' 
0
30 апр. Die Antwort wird von Alan Dong am 30. April gegeben. 2016-04-30 03:28 '16 am 3:28 2016-04-30 03:28

Hier sind reguläre Ausdrücke nützlich! Die Javascript-Methode .replace() einen regulären Ausdruck, mit dem Sie erreichen können, was Sie möchten:

 // assuming var x = filename.jpg or some extension x = x.replace(/(.*)\.[^.]+$/, "$1"); 
0
23 нояб. Antwort gegeben Alex 23 Nov. 2010-11-23 00:32 '10 um 0:32 2010-11-23 00:32

Ein weiterer Liner - wir gehen davon aus, dass unsere Datei jpg-image ist → ex: var yourStr = 'test.jpg';

  yourStr = yourStr.slice(0, -4); // 'test' 
0
16 авг. Die Antwort lautet SorinN 16 aug. 2014-08-16 05:47 '14 um 5:47 2014-08-16 05:47

Sie müssen zuerst die korrekte Dateierweiterung erhalten, dann können Sie sie löschen

versuchen Sie diesen Code

 <!DOCTYPE html> <html> <body> <p>Click the button to display the array values after the split.</p> <button onclick="myFunction()">Try it</button> <p id="demo"></p> <script> function getFileName(str){ var res = str.split('.').pop(); alert('filename: ' + str.replace('.' + res, '')); alert('extension: ' +res); } function myFunction() { getFileName('abc.jpg'); getFileName('abc.def.jpg'); getFileName('abc.def.ghi.jpg'); getFileName('abc.def.ghi.123.jpg'); getFileName('abc.def.ghi.123.456.jpg'); getFileName('abc.jpg.xyz.jpg'); // test with Sébastien comment lol } </script> </body> </html> 
-1
23 нояб. Die Antwort ist VnDevil 23. November gegeben . 2018-11-23 09:37 '18 um 09:37 Uhr 2018-11-23 09:37 Uhr

Ich würde so etwas wie xSubstring (0, x.lastIndexOf ('.')) Verwenden. Wenn Sie zur Arbeit gehen, gehen Sie nicht zu Javascript: -p Nein, eine weitere Aussage spielt für 99,99999% aller Ziele keine Rolle.

-2
23 нояб. Antwort Lucas Moeskops 23. November 2010-11-23 00:29 '10 am 0:29 2010-11-23 00:29