717 Stimmen

Wie kann ich Dateierweiterungen mit JavaScript erhalten?

Siehe Code:

var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc

function getFileExtension(filename) {
    /*TODO*/
}

8voto

Jack Punkte 1811

Code

/**
 * 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
};

Test

Beachten Sie, dass das Fragment auch dann vorhanden sein kann, wenn keine Abfrage erfolgt.

"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 Warnungen.

0 Stimmen

Es funktioniert nicht, wenn Sie einen weiteren Schrägstrich am Ende einfügen, z. B. etwas Verschlüsseltes, z. B: "example.com:8080/segment1/segment2/page.html?enc=abc/def"

7voto

Mateja Petrovic Punkte 2991

Es gibt auch einen einfachen Ansatz mit ES6-Destrukturierung:

const path = 'hello.world.txt'
const [extension, ...nameParts] = path.split('.').reverse();
console.log('extension:', extension);

7voto

// 
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"));

7voto

mrbrdo Punkte 7598

Schnell und korrekt mit Pfaden arbeiten

(filename.match(/[^\\\/]\.([^.\\\/]+)$/) || [null]).pop()

Einige Sonderfälle

/path/.htaccess => null
/dir.with.dot/file => null

Lösungen mit Split sind langsam und Lösungen mit lastIndexOf behandeln keine Randfälle.

0 Stimmen

Welche Grenzfälle meinen Sie? Bitte sehen Sie sich meine Lösung hier an: stackoverflow.com/a/12900504/1249581 . Es funktioniert in allen Fällen gut und viel schneller als jede Regex.

0 Stimmen

Ich habe bereits die Grenzfälle aufgelistet. Und Ihre Lösung behandelt sie NICHT richtig. Wie ich bereits geschrieben habe, versuchen Sie "/dir.with.dot/file". Ihr Code gibt "dot/file" zurück, was lächerlich falsch ist.

1 Stimmen

Niemand hat darum gebeten, den Pfad zu analysieren. Die Frage bezog sich auf das Extrahieren von Erweiterungen aus Dateinamen.

6voto

boehm_s Punkte 4842

"Einzeiler" zum Ermitteln von Dateinamen und Erweiterung mit reduce y Array-Destrukturierung :

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});

mit besserer Einrückung :

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"
// }

0 Stimmen

Sie können Babel / Typescript / Polyfills für fehlende ES7+ Funktionen des IE 11 verwenden

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