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

IT技术 javascript file-extension
2021-01-28 04:54:54

见代码:

var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc

function getFileExtension(filename) {
    /*TODO*/
}
6个回答

较新的编辑:自从这个问题最初发布以来,很多事情都发生了变化——在wallacer 的修订答案以及VisioN 的出色分类中有很多非常好的信息


编辑:仅仅因为这是公认的答案;华莱士的回答确实好很多:

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

我的旧答案:

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

应该做。

编辑:为了回应 PhiLho 的评论,请使用以下内容:

return (/[.]/.exec(filename)) ? /[^.]+$/.exec(filename) : undefined;
所有可能的情况处理如下: return filename.split(".").slice(1).pop() || "";
2021-03-20 04:54:54
不幸的是,对于file.htaccess 之类的名称,这两种解决方案都失败了
2021-03-30 04:54:54
两次执行正则表达式不是很贵吗?
2021-04-06 04:54:54
下面评价很高的答案要好得多。
2021-04-06 04:54:54
@JustAndrei 仍然不是全部 :) 对于纯文件名(基本名称?),而不是路径,出于实际原因,我认为它应该是return filename.substring(0,1) === '.' ? '' : filename.split('.').slice(1).pop() || '';这也处理.file(Unix 隐藏,我相信)类型的文件。那就是如果你想把它保留为单线,这对我的口味来说有点凌乱。
2021-04-08 04:54:54
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 慢一点但是,对于大多数常见用途,此代码应该完全可用。

我无法评论性能,但这个看起来确实很干净!我正在使用它。+1
2021-03-16 04:54:54
@wallacer:如果filename实际上没有扩展名会怎样?这不会简单地返回基本文件名,这会有点糟糕吗?
2021-03-22 04:54:54
但在这种情况下,文件名看起来像 filname.tes.test.jpg。请考虑输出。我希望它是假的。
2021-03-24 04:54:54
在这种情况下,输出是“jpg”
2021-04-02 04:54:54
杰出的!非常感谢。很高兴看到不使用正则表达式的解决方案;我已经用 PHP 做到了这一点,它只使用了几个函数。+1
2021-04-03 04:54:54

以下解决方案足够快速简短,可用于批量操作并节省额外字节:

 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"

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

速度对比

短的如何工作:

  1. String.lastIndexOf方法返回子字符串(即".")在给定字符串(即fname)中的最后一个位置如果未找到子字符串,则方法返回-1.
  2. 文件名中点的“不可接受”位置是-10,它们分别表示没有扩展名的名称(例如"name")和以点开头的名称(例如".htaccess")。
  3. 零填充向右移位运算符>>>)如果与零使用影响负数转变-14294967295-24294967294,这是剩下的(那种一招在这里)的文件名中的边缘情况不变有用。
  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 代码中使用。

他从来没有明确说过,显然如果它适用于路径,它会更有用
2021-03-15 04:54:54
这一条线的速度在任何应用中都不会产生明显的差异。Bitwise 很少使用,以至于 JSLint 和 JSHint 等流行的 linter 警告不要使用它们。对这种逻辑的性能和紧凑性的痴迷降低了代码的质量;如果代码需要“额外调查”,我认为它“不好”。
2021-03-19 04:54:54
为什么要不遗余力地优化如此微不足道的代码行?Tilde 和 bitshift 运算符在 JavaScript 中很少出现,我无法支持这样的答案。如果需要 5 个要点来解释 1 行代码的工作原理,最好重写代码,使其实际上易于理解。
2021-03-20 04:54:54
@mrbrdo 根据问题的要求,此方法不应该仅适用于文件名的完整路径。在否决之前仔细阅读问题。
2021-03-28 04:54:54
@Jackson 考虑到这是一个为问题提供多种解决方案的网站,拥有优化性能的解决方案从来都不是坏事。您的陈述“不会在任何应用程序中产生明显的差异”完全基于您可以使用的可能应用程序的狭窄范围。除此之外,它可能会为某人提供学习经验,以便他们可以优化一些问题他们需要为正在编写的计算密集型应用程序编写其他代码。
2021-04-10 04:54:54
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")
要使其在 IE 中工作: var pattern = "^.+\\.([^.]+)$"; var ext = new RegExp(pattern);
2021-03-28 04:54:54
function getExt(filename)
{
    var ext = filename.split('.').pop();
    if(ext == filename) return "";
    return ext;
}
返回(ext===文件名)?'':分机;
2021-03-16 04:54:54