我如何使用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方法返回给定字符串(即fnamefname字符串的最后位置(即"." )。 如果未找到子字符串,则方法返回-1
  • 文件名中点的“不可接受”位置分别为-10 ,分别表示不带扩展名的名称(例如"name" )和以点开头的名称(例如".htaccess" )。
  • 零填充右移运算符( >>> )如果与零一起使用会影响负数转换-14294967295-24294967294 ,这有助于在边缘情况下保持文件名不变(此处有一种技巧)。
  • String.prototype.sliceString.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

    上一篇: How can I get file extensions with JavaScript?

    下一篇: Open link in new tab or window