如何从JavaScript中的字符串中修剪文件扩展名?

问题描述 投票:270回答:24

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

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

javascript replace substring substr indexof
24个回答
149
投票

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

如果您不知道@John Hartsock regex的长度是正确的方法。

如果不想使用正则表达式,可以尝试一下(性能较差):

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

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


9
投票

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

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('.')


7
投票

另一个单线:

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

6
投票

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

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

这仅应切掉最后一段。


6
投票

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

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

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

6
投票

简单的一个:

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

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

3
投票

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

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. 第一个比较慢,原因是执行更多操作;但在两种情况下均有效,换句话说,它可以提取包含路径或带ex的文件名的给定字符串中不带扩展名的文件名。虽然第二个方法仅在给定变量包含带有ext的文件名(如filename.ext)的情况下才有效,但要快一些。
  2. 这两种解决方案都适用于本地文件和服务器文件;

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

工作片段1:完整路径

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

工作片段2:带扩展名的文件名

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

工作片段2:具有双扩展名的文件名

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

2
投票

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

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


0
投票

这是正则表达式派上用场的地方! Javascript的.replace()方法将使用正则表达式,您可以利用它来完成所需的操作:

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

0
投票

另一种衬板-我们假定文件是jpg图片>>例如:var yourStr ='test.jpg';

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

432
投票

[不确定执行什么会更快,但是在扩展名.jpeg.html时会更可靠

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

0
投票

您可以使用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'

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

0
投票

这是我用于从文件名中删除扩展名的代码,而不使用regex或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;
}

0
投票

Node.js从完整路径保留目录中删除扩展名

#!/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

在Node.js v10.15.2。中测试。


-2
投票

我会使用x.substring(0,x.lastIndexOf('。'))之类的东西。如果您要提高性能,就不要使用javascript :-p不,对于99.99999%的所有用途,再声明一次并不重要。


222
投票

node.js中,不具有扩展名的文件名可以按如下方式获得。

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

path.parse(filename).name; // hello
path.parse(filename).ext;  // .html

Node.js documentation页面的进一步说明。


113
投票

x.length-4仅占3个字符的扩展名。如果您有filename.jpegfilename.pl怎么办?

编辑:

要回答...当然,如果您始终具有.jpg的扩展名,x.length-4就可以了。

但是,如果您不知道扩展名的长度,那么许多解决方案中的任何一种都会更好/更可靠。

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

OR

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

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

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

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

或(也只有一个点)

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

38
投票

您也许可以假设最后一个点将是扩展定界符。

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

16
投票

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

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

当然,这也适用于0.12.x和更高版本。


13
投票

我喜欢这个,因为它是一种很难读的衬里:

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

12
投票

即使字符串中不存在定界符,也可以使用。

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 + ""
}

9
投票

这也可以使用basename和extname方法通过path轻松完成。

const path = require('path')

path.basename('test.txt', path.extname('test.txt'))
© www.soinside.com 2019 - 2024. All rights reserved.