如何修剪一个文件扩展名从字符串在JavaScript?

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

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

426490 次浏览

x.length-4只支持3个字符的扩展。如果你有__abc1或filename.pl呢?

编辑:

回答……当然,如果你总是有.jpg的扩展名,x.length-4就可以了。

但是,如果您不知道扩展的长度,那么许多解决方案中的任何一个都更好/更健壮。

x = x.replace(/\..+$/, '');

x = x.substring(0, x.lastIndexOf('.'));

x = x.replace(/(.*)\.(.*?)$/, "$1");

OR(假设文件名只有一个点)

parts = x.match(/[^\.]+/);
x = parts[0];

OR(也是只有一个点)

parts = x.split(".");
x = parts[0];

不确定哪个会执行得更快,但当涉及到.jpeg.html这样的扩展时,这将更可靠

x.replace(/\.[^/.]+$/, "")

如果你知道扩展的长度,你可以使用x.slice(0, -4)(其中4是扩展的三个字符和点)。

如果你不知道长度@John Hartsock 正则表达式将是正确的方法。

如果你不想使用正则表达式,你可以试试这个(性能更差):

filename.split('.').slice(0, -1).join('.')

注意,它将在没有扩展名的文件上失败。

我将使用类似x.substring(0, x.lastIndexOf('.'))的东西。如果你追求的是性能,那就不要用javascript:-p不,多一条语句对于99.99999%的目的来说真的没什么关系。

您也许可以假设最后一个点是扩展分隔符。

var x = 'filename.jpg';
var f = x.substr(0, x.lastIndexOf('.'));

如果文件没有扩展名,它将返回空字符串。要解决这个问题,请使用这个函数

function removeExtension(filename){
var lastDotPosition = filename.lastIndexOf(".");
if (lastDotPosition === -1) return filename;
else return filename.substr(0, lastDotPosition);
}

这就是正则表达式派上用场的地方!Javascript的.replace()方法将接受一个正则表达式,你可以利用它来完成你想要的:

// assuming var x = filename.jpg or some extension
x = x.replace(/(.*)\.[^.]+$/, "$1");

另一个一行程序:

x.split(".").slice(0, -1).join(".")

另一行-我们假设我们的文件是一个jpg图片>> ex: var yourStr = 'test.jpg';

    yourStr = yourStr.slice(0, -4); // 'test'

即使在字符串中不存在分隔符时,这也是有效的。

String.prototype.beforeLastIndex = function (delimiter) {
return this.split(delimiter).slice(0,-1).join(delimiter) || this + ""
}


"image".beforeLastIndex(".") // "image"
"image.jpeg".beforeLastIndex(".") // "image"
"image.second.jpeg".beforeLastIndex(".") // "image.second"
"image.second.third.jpeg".beforeLastIndex(".") // "image.second.third"

也可以像这样作为一行代码使用:

var filename = "this.is.a.filename.txt";
console.log(filename.split(".").slice(0,-1).join(".") || filename + "");

编辑:这是一个更有效的解决方案:

String.prototype.beforeLastIndex = function (delimiter) {
return this.substr(0,this.lastIndexOf(delimiter)) || this + ""
}

下面是另一个基于正则表达式的解决方案:

filename.replace(/\.[^.$]+$/, '');

这应该只切掉最后一部分。

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

我曾经不得不剥离所有扩展名(.tar.gz),文件名被限制为不包含点(所以2015-01-01.backup.tar不会是一个问题):

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

node . js中,不带扩展名的文件名可以通过如下方式获取。

const path = require('path');
const filename = 'hello.html';
    

path.parse(filename).name;     //=> "hello"
path.parse(filename).ext;      //=> ".html"
path.parse(filename).base; //=> "hello.html"

进一步解释在node . js 文档页。

这是我用来从文件名中删除扩展名的代码,不使用regex或indexOf (indexOf在IE8中不支持)。它假定扩展名是最后一个'之后的任何文本。'字符。

它适用于:

  • 没有扩展名的文件:"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;
}

我不知道这是否是一个有效的选项,但我使用这个:

name = filename.split(".");
// trimming with pop()
name.pop();
// getting the name with join()
name.join('.'); // we split by '.' and we join by '.' to restore other eventual points.

这不仅仅是我知道的一种操作,但至少它应该总是有效的!

更新:如果你想要一个在线,这里你是:

(name.split('.').slice(0, -1)).join('.')

在0.12.x之前的Node.js版本中:

path.basename(filename, path.extname(filename))

当然,这也适用于0.12。X和以后。

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

你可以使用path来操纵。

var MYPATH = '/User/HELLO/WORLD/FILENAME.js';
var MYEXT = '.js';
var fileName = path.basename(MYPATH, MYEXT);
var filePath = path.dirname(MYPATH) + '/' + fileName;

输出

> filePath
'/User/HELLO/WORLD/FILENAME'
> fileName
'FILENAME'
> MYPATH
'/User/HELLO/WORLD/FILENAME.js'

简单的一个:

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

如果你必须处理一个包含完整路径的变量(例如:thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"),并且你只想返回“filename”,你可以使用:

theName = thePath.split("/").slice(-1).join().split(".").shift();

结果将是name == "filename";

要尝试它,请将以下命令写入chrome调试器的控制台窗口: window.location.pathname.split("/").slice(-1).join().split(".").shift() < / >强

如果你必须只处理文件名及其扩展名(例如:theNameWithExt = "filename.jpg"):

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

结果将是name == "filename",与上面相同;

注:

  1. 第一个稍微慢一点,因为执行得更多 操作;但在两种情况下都有效,换句话说,它可以提取 没有扩展名的文件名来自一个给定的字符串,该字符串包含一个路径或一个带有ex的文件名。而第二种方法仅适用于给定变量包含一个带有ext的文件名,如filename。
  2. . .
  3. 这两种解决方案都适用于本地和服务器文件;

但我不能说与其他答案的性能比较,也不能说浏览器或操作系统的兼容性。

工作片段1:完整路径

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);
  

x.slice(0, -(x.split('.').pop().length + 1));

我喜欢这篇文章,因为它只有一行字,读起来不难:

filename.substring(0, filename.lastIndexOf('.')) || filename

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

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

Node.js从全路径保存目录中删除扩展

例如,https://stackoverflow.com/a/31615711/895245做了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://stackoverflow.com/a/36099196/895245也实现了这一点,但我发现这种方法在语义上更讨人喜欢。

在Node.js v10.15.2中测试。

我喜欢用正则表达式来做。它很短,很容易理解。

for (const regexPattern of [
/\..+$/,  // Find the first dot and all the content after it.
/\.[^/.]+$/ // Get the last dot and all the content after it.
]) {
console.log("myFont.ttf".replace(regexPattern, ""))
console.log("myFont.ttf.log".replace(regexPattern, ""))
}


/* output
myFont
myFont
myFont
myFont.ttf
*/

上述解释可能不是很严谨。如果你想得到一个更准确的解释,可以去regex101检查

  • < a href = " https://regex101.com/r/B2pmXk/1/ " rel =“nofollow”noreferrer > \ . . + $ < / >
  • < a href = " https://regex101.com/r/XPQ6mu/1 " rel = " nofollow noreferrer ">\.[^/.]+$
name.split('.').slice(0, -1).join('.')

这就是所有的享受你的编码…

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

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

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

它解决了文件扩展的问题,特别是当输入有多个扩展名时。

  • 如果你使用的是Node.js,一个简单的答案就是第一条注释。
  • 我的任务是我需要从节点服务器删除Cloudinary中的一个图像,我只需要获得图像名称。 李的例子:< / >
const path = require("path")
const image=xyz.jpg;
const img= path.parse(image).name
console.log(img) // xyz