看代码:

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

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

当前回答

function file_get_ext(filename)
    {
    return typeof filename != "undefined" ? filename.substring(filename.lastIndexOf(".")+1, filename.length).toLowerCase() : false;
    }

其他回答

return filename.split('.').pop();

编辑:

这是另一个我认为更有效的非正则表达式解决方案:

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

下面的VisioN的答案可以更好地处理一些极端情况,特别是没有扩展名(。包括Htaccess等)。

它的性能非常好,并且以一种可以说更好的方式处理边缘情况,当没有点或点前没有字符串时,返回""而不是完整的字符串。这是一个精心设计的解决方案,尽管很难阅读。把它放在你的助手库中,然后使用它。

老编辑:

如果遇到没有扩展名的文件,或者没有扩展名的隐藏文件(参见VisioN对Tom的回答的评论),一个更安全的实现应该是这样的

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

如果a.length为1,则它是一个没有扩展名ie的可见文件。文件

如果一个[0]=== ""和a.length === 2,它是一个隐藏文件,没有扩展名为。htaccess

这应该可以解决稍微复杂一些的情况下的问题。在性能方面,我认为这个解决方案比大多数浏览器中的regex稍微慢一些。然而,对于大多数常见的目的,这段代码应该是完全可用的。

如果你正在处理web url,你可以使用:

function getExt(filepath){
     return filepath.split("?")[0].split("#")[0].split('.').pop();
}

getExt("../js/logic.v2.min.js") // js
getExt("http://example.net/site/page.php?id=16548") // php
getExt("http://example.net/site/page.html#welcome.to.me") // html
getExt("c:\\logs\\yesterday.log"); // log

演示:https://jsfiddle.net/squadjot/q5ard4fj/

一行解决方案,也将考虑查询参数和url中的任何字符。

string.match(/(.*)\??/i).shift().replace(/\?.*/, '').split('.').pop()

// Example
// some.url.com/with.in/&ot.s/files/file.jpg?spec=1&.ext=jpg
// jpg
var parts = filename.split('.');
return parts[parts.length-1];

在path模块中有一个标准库函数:

import path from 'path';

console.log(path.extname('abc.txt'));

输出:

. txt

所以,如果你只想要格式:

path.extname('abc.txt').slice(1) // 'txt'

如果没有扩展名,函数将返回一个空字符串:

path.extname('abc') // ''

如果使用Node,则path是内置的。如果你的目标是浏览器,那么Webpack将为你捆绑一个路径实现。如果你的目标浏览器没有Webpack,那么你可以手动包含path-browserify。

没有理由进行字符串分割或正则表达式。