REGEX: Capture Filename from URL without file extension

前端 未结 5 1298
忘掉有多难
忘掉有多难 2020-12-01 05:40

I am trying to create a Javascript Regex that captures the filename without the file extension. I have read the other posts here and \'goto this page: http://gunbl

5条回答
  •  难免孤独
    2020-12-01 06:39

    I did not find any of the answers to be near robust enough. Here is my solution.

    function getFileName(url, includeExtension) {
        var matches = url && typeof url.match === "function" && url.match(/\/?([^/.]*)\.?([^/]*)$/);
        if (!matches)
            return null;
    
        if (includeExtension && matches.length > 2 && matches[2]) {
            return matches.slice(1).join(".");
        }
        return matches[1];
    }
    
    var url = "http://example.com/index.htm";
    var filename = getFileName(url);
    // index
    filename = getFileName(url, true);
    // index.htm
    
    url = "index.htm";
    filename = getFileName(url);
    // index
    filename = getFileName(url, true);
    // index.htm
    
    // BGerrissen's examples
    url = "http://stackoverflow.com/questions/3671522/regex-capture-filename-from-url-without-file-extention";
    filename = getFileName(url);
    // regex-capture-filename-from-url-without-file-extention
    filename = getFileName(url, true);
    // regex-capture-filename-from-url-without-file-extention
    
    url = "http://gunblad3.blogspot.com/2008/05/uri-url-parsing.html";
    filename = getFileName(url);
    // uri-url-parsing
    filename = getFileName(url, true);
    // uri-url-parsing.html
    
    // BGerrissen fails
    url = "http://gunblad3.blogspot.com/2008/05/uri%20url-parsing.html";
    filename = getFileName(url);
    // uri%20url-parsing
    filename = getFileName(url, true);
    // uri%20url-parsing.html
    
    // George Pantazis multiple dots
    url = "http://gunblad3.blogspot.com/2008/05/foo.global.js";
    filename = getFileName(url);
    // foo
    filename = getFileName(url, true);
    // foo.global.js
    
    // Fringe cases
    url = {};
    filename = getFileName(url);
    // null
    url = null;
    filename = getFileName(url);
    // null
    

    To fit with the original question, the default behavior is to exclude the extension, but that can easily be reversed.

提交回复
热议问题