How can I get file extensions with JavaScript?

后端 未结 30 1831
终归单人心
终归单人心 2020-11-22 09:37

See code:

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

function getFileExt         


        
相关标签:
30条回答
  • 2020-11-22 10:16

    This simple solution

    function extension(filename) {
      var r = /.+\.(.+)$/.exec(filename);
      return r ? r[1] : null;
    }
    

    Tests

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

    0 讨论(0)
  • 2020-11-22 10:17

    If you are looking for a specific extension and know its length, you can use substr:

    var file1 = "50.xsl";
    
    if (file1.substr(-4) == '.xsl') {
      // do something
    }
    

    JavaScript reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr

    0 讨论(0)
  • 2020-11-22 10:18

    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

    Notice that in the absence of a query, the fragment might still be present.

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

    0 讨论(0)
  • 2020-11-22 10:19
    return filename.split('.').pop();
    

    Keep it simple :)

    Edit:

    This is another non-regex solution that I believe is more efficient:

    return filename.substring(filename.lastIndexOf('.')+1, filename.length) || filename;
    

    There are some corner cases that are better handled by VisioN's answer below, particularly files with no extension (.htaccess etc included).

    It's very performant, and handles corner cases in an arguably better way by returning "" instead of the full string when there's no dot or no string before the dot. It's a very well crafted solution, albeit tough to read. Stick it in your helpers lib and just use it.

    Old Edit:

    A safer implementation if you're going to run into files with no extension, or hidden files with no extension (see VisioN's comment to Tom's answer above) would be something along these lines

    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
    

    If a.length is one, it's a visible file with no extension ie. file

    If a[0] === "" and a.length === 2 it's a hidden file with no extension ie. .htaccess

    Hope this helps to clear up issues with the slightly more complex cases. In terms of performance, I believe this solution is a little slower than regex in most browsers. However, for most common purposes this code should be perfectly usable.

    0 讨论(0)
  • 2020-11-22 10:19
    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;
    }
    

    //usage

    extension('file.jpeg')

    always returns the extension lower cas so you can check it on field change works for:

    file.JpEg

    file (no extension)

    file. (noextension)

    0 讨论(0)
  • 2020-11-22 10:20
    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");
      }
    }
    
    0 讨论(0)
提交回复
热议问题