为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用JavaScript获得文件扩展名?

如何使用JavaScript获得文件扩展名?

料青山看我应如是 2019-07-13 18:58:07
见代码:var file1 = "50.xsl";var file2 = "30.doc";getFileExtension(file1); //returns xslgetFileExtension(file2); //returns docfunction getFileExtension(filename) {    /*TODO*/}
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

自从这个问题最初发布以来,很多事情都发生了变化-有很多非常好的信息墙纸的修订答案以及视力极差


编辑:仅仅因为这是公认的答案;壁虎的回答确实要好得多:

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

我以前的回答是:

return /[^.]+$/.exec(filename);

应该这么做。

编辑:在回应PhiLho的评论时,请使用如下内容:

return (/[.]/.exec(filename)) ? /[^.]+$/.exec(filename) : undefined;


查看完整回答
反对 回复 2019-07-13
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

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是一个没有扩展名的可见文件。档案

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

希望这有助于澄清稍微复杂的案件的问题。就性能而言,我相信这个解决方案是比regex慢一点在大多数浏览器中。但是,对于大多数常见的目的,这段代码应该是完全可用的。


查看完整回答
反对 回复 2019-07-13
?
守候你守候我

TA贡献1802条经验 获得超10个赞

以下解决方案是快地矮的足够用于大容量操作并保存额外字节:

 return fname.slice((fname.lastIndexOf(".") - 1 >>> 0) + 2);

下面是另一个单行非regexp通用解决方案:

 return fname.slice((Math.max(0, fname.lastIndexOf(".")) || Infinity) + 1);

两种方法都能正确地使用没有扩展名的名称(例如:我的档案)或以.点(例如:.htaccess):

 ""                            -->   ""
 "name"                        -->   ""
 "name.txt"                    -->   "txt"
 ".htpasswd"                   -->   ""
 "name.with.many.dots.myext"   -->   "myext"

如果您关心的速度,您可以运行基准并检查所提供的解决方案是最快的,而短的解决方案则是非常快的:

短的一个是如何工作的:

  1. String.lastIndexOf

    方法返回子字符串的最后一个位置(即

    "."

    )在给定的字符串(即

    fname

    )。如果没有找到子字符串,则方法返回

    -1.

  2. 文件名中点的“不可接受”位置是

    -1

    0

    ,分别指没有扩展的名称(例如:

    "name"

    )和以点开头的名称(例如,

    ".htaccess").

  3. 零填充右移位算子 (>>>

    )如果与零一起使用会影响负数转换

    -1

    4294967295

    -2

    4294967294

    ,这对于在边缘情况下保持文件名不变很有用(这里的技巧是这样的)。
  4. 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代码中使用。


查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 701 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信