我如何使用JavaScript获取文件扩展名?
见代码:
var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc
function getFileExtension(filename) {
/*TODO*/
}
更新的编辑:自从这个问题最初发布以来,很多事情都发生了变化 - wallacer的修改后的答案以及VisioN的出色分解中有很多非常好的信息
编辑:只是因为这是被接受的答案; wallacer的答案确实好得多:
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
等)。
这是非常高效的,并且在点之前没有点或没有字符串的情况下,通过返回""
而不是完整的字符串来处理转角情况。 这是一个制作精良的解决方案,尽管难以阅读。 把它放在你的助手库中,然后使用它。
旧编辑:
如果你打算遇到没有扩展名的文件,或者没有扩展名的隐藏文件(参见上面的Tom的回答,请参阅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
它是一个没有扩展名的隐藏文件ie。 的.htaccess
希望这有助于解决稍微复杂的案例。 在性能方面,我相信这个解决方案在大多数浏览器中比正则表达式要慢一些。 但是,对于大多数常见目的,此代码应该完全可用。
以下解决方案速度快且足够短 ,可用于批量操作并节省额外的字节:
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
) fname
字符串的最后位置(即"."
)。 如果未找到子字符串,则方法返回-1
。 -1
和0
,分别表示不带扩展名的名称(例如"name"
)和以点开头的名称(例如".htaccess"
)。 >>>
)如果与零一起使用会影响负数转换-1
到4294967295
和-2
到4294967294
,这有助于在边缘情况下保持文件名不变(此处有一种技巧)。 String.prototype.slice
从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代码中使用。
链接地址: http://www.djcxy.com/p/20169.html