如何在JavaScript中从字符串中删除文件扩展名?

505

比如,假设 x = filename.jpg,我想要得到 filename,其中filename可以是任何文件名(为了简化,我们假设文件名只包含 [a-zA-Z0-9-_])。

我在DZone Snippets上看到了 x.substring(0, x.indexOf('.jpg')),但是 x.substring(0, x.length-4) 会更好吗?因为 length 是一个属性,不进行字符检查,而 indexOf() 是一个函数,会进行字符检查。


基本上和 https://dev59.com/OHI-5IYBdhLWcg3wKE-x 一样。除非你要做很多这样的事情,否则担心效率是过早优化。 - The Archetypal Paul
在ES6时代,如果你正在使用nodejs或适当的转译,请查看Path模块。 - Frank N
27个回答

8

如果您需要处理包含完整路径的变量(例如:thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"),并且您只想返回“filename”,您可以使用以下代码:

var filename = thePath.substring(thePath.lastIndexOf("/") + 1);
theName = thePath.split("/").slice(-1).join().split(".").shift();

结果将会是theName == "filename";

为了尝试它,请在Chrome调试器的控制台窗口中输入以下命令:window.location.pathname.split("/").slice(-1).join().split(".").shift()

如果你只需要处理文件名和扩展名(例如:theNameWithExt = "filename.jpg"):

theName = theNameWithExt.split(".").shift();

结果将会是theName == "filename",与上面的相同;

注:

  1. 第一种方法稍微慢一些,因为执行了更多的操作;但是在任何情况下都可以工作,也就是说,它可以从包含路径或带有扩展名的文件名的给定字符串中提取没有扩展名的文件名。而第二种方法只适用于给定变量包含带有扩展名的文件名,例如filename.ext,但速度要快一点。
  2. 这两种解决方案都适用于本地和服务器文件;

但是我无法对与其他答案的性能比较或浏览器或操作系统兼容性做出任何评论。

working snippet 1: the complete path

var thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg";
theName = thePath.split("/").slice(-1).join().split(".").shift();
alert(theName);
  

working snippet 2: the file name with extension

var theNameWithExt = "filename.jpg";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);
  

working snippet 2: the file name with double extension

var theNameWithExt = "filename.tar.gz";
theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
alert(theName);
  


7
这里有另一个基于正则表达式的解决方案:
filename.replace(/\.[^.$]+$/, '');

这应该只去掉最后一段。


7

简单易懂:

var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;

6
var fileName = "something.extension";
fileName.slice(0, -path.extname(fileName).length) // === "something"

到目前为止,这是唯一可用于完整路径的方法:path/name.ext -> paht/name,而不仅仅返回name,但我宁愿使用fs.parse,尽管它有点冗长:https://dev59.com/KW855IYBdhLWcg3wm1m3#59576950 - Ciro Santilli OurBigBook.com
我喜欢这个回答...此外,如果您事先知道扩展名(或者扩展名是一个变量),那么我发现更易读的是使用以下语句: filename.slice(0, -'.zip'.length) 或者 filename.slice(0, -extension.length) - Nick Grealy

6

被接受的答案仅剥离最后一个扩展名部分(.jpeg),在大多数情况下这可能是一个不错的选择。

我曾经需要剥离所有扩展名(.tar.gz),并且文件名限制不包含点(因此 2015-01-01.backup.tar 不会成为问题):

var name = "2015-01-01_backup.tar.gz";
name.replace(/(\.[^/.]+)+$/, "");

6
  • 如果您正在使用Node.js,一个简单的答案可以在第一条评论中找到。
  • 我的任务是从Node服务器中删除Cloudinary中的图像,并且我只需要获取图像名称。 例如:
const path = require("path")
const image=xyz.jpg;
const img= path.parse(image).name
console.log(img) // xyz

5

Node.js去除完整路径中的扩展名并保留目录

例如https://dev59.com/KW855IYBdhLWcg3wm1m3#31615711所示,将path/hello.html转换成hello,但如果您想将path/hello.html转换成path/hello,可以使用以下代码:

#!/usr/bin/env node
const path = require('path');
const filename = 'path/hello.html';
const filename_parsed = path.parse(filename);
console.log(path.join(filename_parsed.dir, filename_parsed.name));

同时输出目录:

path/hello

https://dev59.com/KW855IYBdhLWcg3wm1m3#36099196也可以实现这个功能,但是我认为这种方法更加语义化。

在Node.js v10.15.2中进行了测试。


4

虽然有点晚了,我会添加另一种使用普通旧JS获取没有扩展名的文件名的方法 -

path.replace(path.substr(path.lastIndexOf('.')), '')


或者对于单一文件扩展名,可以使用path.split('.').pop() - mixdev
他实际上是想获取文件名,而不是扩展名! - Munim

1

我们可能会遇到带有多个扩展名后缀的文件名或文件路径。考虑以下方法来修剪它们。

text = "/dir/path/filename.tar.gz"    
output = text.replace(/(\.\w+)+$/,"")

输出结果:"/dir/path/filename"

当输入具有多个扩展名时,它可以解决文件扩展名问题。


1
请阅读如何撰写一个好的答案?。虽然这个代码块可能回答了OP的问题,但如果您解释一下这段代码与问题中的代码有什么不同,您做了哪些更改,为什么要更改以及为什么这样解决问题而不引入其他问题,那么这个答案会更有用。 - Saeed Zhiany

0

这是我用来从文件名中删除扩展名的代码,而不使用正则表达式或indexOf(在IE8中不支持indexOf)。它假设扩展名是最后一个“.”字符之后的任何文本。

它适用于:

  • 没有扩展名的文件:“myletter”
  • 名称中带有“.”的文件:“my.letter.txt”
  • 未知长度的文件扩展名:“my.letter.html”

以下是代码:

var filename = "my.letter.txt" // some filename

var substrings = filename.split('.'); // split the string at '.'
if (substrings.length == 1)
{
  return filename; // there was no file extension, file was something like 'myfile'
}
else
{
  var ext = substrings.pop(); // remove the last element
  var name = substrings.join(""); // rejoin the remaining elements without separator
  name = ([name, ext]).join("."); // readd the extension
  return name;
}

失败原因为 hello.tar.gz,输出为 hellotar - Asif Ali
#AsifAli 谢谢你,你是对的,我忘记添加文件扩展名了。我已经更新了答案,希望现在可以正常工作。 - Little Brain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接