见代码:
var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc
function getFileExtension(filename) {
/*TODO*/
}
见代码:
var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc
function getFileExtension(filename) {
/*TODO*/
}
较新的编辑:自从这个问题最初发布以来,很多事情都发生了变化——在wallacer 的修订答案以及VisioN 的出色分类中有很多非常好的信息
编辑:仅仅因为这是公认的答案;华莱士的回答确实好很多:
return filename.split('.').pop();
我的旧答案:
return /[^.]+$/.exec(filename);
应该做。
编辑:为了回应 PhiLho 的评论,请使用以下内容:
return (/[.]/.exec(filename)) ? /[^.]+$/.exec(filename) : undefined;
return filename.split('.').pop();
编辑:
这是我认为更有效的另一种非正则表达式解决方案:
return filename.substring(filename.lastIndexOf('.')+1, filename.length) || filename;
下面的VisioN 回答可以更好地处理一些极端情况,特别是没有扩展名的文件(.htaccess
包括在内)。
它非常高效,""
当没有点或点之前没有字符串时,通过返回而不是完整字符串,以一种可以说是更好的方式处理极端情况。这是一个精心设计的解决方案,尽管很难阅读。将它粘贴在您的助手库中并使用它。
旧编辑:
如果您要遇到没有扩展名的文件或没有扩展名的隐藏文件(请参阅 VisioN 对上面汤姆回答的评论),一个更安全的实现将是这样的
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
是一个,它是一个没有扩展名的可见文件,即。文件
如果a[0] === ""
和a.length === 2
它是一个隐藏文件,没有扩展名,即。.htaccess
这应该可以解决稍微复杂一点的问题。在性能方面,我认为这个解决方案在大多数浏览器中比 regex 慢一点。但是,对于大多数常见用途,此代码应该完全可用。
以下解决方案足够快速且简短,可用于批量操作并节省额外字节:
return fname.slice((fname.lastIndexOf(".") - 1 >>> 0) + 2);
这是另一个单行非正则表达式通用解决方案:
return fname.slice((Math.max(0, fname.lastIndexOf(".")) || Infinity) + 1);
两者都适用于没有扩展名(例如myfile)或以.
点开头(例如.htaccess)的名称:
"" --> ""
"name" --> ""
"name.txt" --> "txt"
".htpasswd" --> ""
"name.with.many.dots.myext" --> "myext"
如果您关心速度,您可以运行基准测试并检查提供的解决方案是否最快,而简短的解决方案非常快:
短的如何工作:
String.lastIndexOf
方法返回子字符串(即"."
)在给定字符串(即fname
)中的最后一个位置。如果未找到子字符串,则方法返回-1
.-1
和0
,它们分别表示没有扩展名的名称(例如"name"
)和以点开头的名称(例如".htaccess"
)。>>>
)如果与零使用影响负数转变-1
到4294967295
和-2
到4294967294
,这是剩下的(那种一招在这里)的文件名中的边缘情况不变有用。String.prototype.slice
从按照描述计算的位置提取文件名的一部分。如果位置编号大于字符串的长度方法返回""
。如果您想要以相同方式工作的更清晰的解决方案(加上对完整路径的额外支持),请查看以下扩展版本。此解决方案将比以前的单行程序慢,但更容易理解。
function getExtension(path) {
var basename = path.split(/[\\/]/).pop(), // extract file name from full path ...
// (supports `\\` and `/` separators)
pos = basename.lastIndexOf("."); // get last position of `.`
if (basename === "" || pos < 1) // if file name is empty or ...
return ""; // `.` not found (-1) or comes first (0)
return basename.slice(pos + 1); // extract extension ignoring `.`
}
console.log( getExtension("/path/to/file.ext") );
// >> "ext"
所有三个变体都应该在客户端的任何 Web 浏览器中工作,并且也可以在服务器端 NodeJS 代码中使用。
function getFileExtension(filename)
{
var ext = /^.+\.([^.]+)$/.exec(filename);
return ext == null ? "" : ext[1];
}
测试过
"a.b" (=> "b")
"a" (=> "")
".hidden" (=> "")
"" (=> "")
null (=> "")
还
"a.b.c.d" (=> "d")
".a.b" (=> "b")
"a..b" (=> "b")
function getExt(filename)
{
var ext = filename.split('.').pop();
if(ext == filename) return "";
return ext;
}