看代码:
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*/
}
当前回答
在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。
没有理由进行字符串分割或正则表达式。
其他回答
别忘了有些文件没有扩展名,所以:
var parts = filename.split('.');
return (parts.length > 1) ? parts.pop() : '';
以下解决方案足够快速和简短,可以用于批量操作并节省额外的字节:
return fname.slice((fname.lastIndexOf(".") - 1 >>> 0) + 2);
下面是另一个单行非regexp通用解决方案:
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 method returns the last position of the substring (i.e. ".") in the given string (i.e. fname). If the substring is not found method returns -1. The "unacceptable" positions of dot in the filename are -1 and 0, which respectively refer to names with no extension (e.g. "name") and to names that start with dot (e.g. ".htaccess"). Zero-fill right shift operator (>>>) if used with zero affects negative numbers transforming -1 to 4294967295 and -2 to 4294967294, which is useful for remaining the filename unchanged in the edge cases (sort of a trick here). String.prototype.slice extracts the part of the filename from the position that was calculated as described. If the position number is more than the length of the string method returns "".
如果你想要更清晰的解决方案,将以同样的方式工作(加上额外的全路径支持),请检查以下扩展版本。这个解决方案比以前的一行程序要慢,但是更容易理解。
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")
var filetypeArray = (file.type).split("/");
var filetype = filetypeArray[1];
在我看来,这是一个更好的方法。
var parts = filename.split('.');
return parts[parts.length-1];