如何在JavaScript中修剪String中的文件扩展名?

时间:2010-11-22 21:24:09

标签: javascript replace substring substr indexof

例如,假设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()是一个函数并进行字符检查。

26 个答案:

答案 0 :(得分:398)

不确定哪些内容会更快,但在.jpeg.html

这样的扩展时更可靠
x.replace(/\.[^/.]+$/, "")

答案 1 :(得分:162)

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

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

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

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

答案 2 :(得分:125)

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

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

如果你不想使用正则表达式,你可以试试这个(效率较低):

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

请注意,没有扩展名的文件会失败。

答案 3 :(得分:110)

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

,该怎么办?

编辑:

要回答...当然,如果您的扩展名为.jpgx.length-4可以正常使用。

但是,如果您不知道扩展的长度,那么任何一种解决方案都会更好/更强大。

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

OR

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

OR

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

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

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

OR(也只有一个点)

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

答案 4 :(得分:37)

您可以使用假设最后一个点将是扩展分隔符。

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

答案 5 :(得分:13)

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

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

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

答案 6 :(得分:11)

即使字符串中没有分隔符,也可以使用。

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

答案 7 :(得分:8)

我喜欢这个,因为它是一个不太难读的单线:

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

答案 8 :(得分:7)

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

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.

这不仅仅是我所知道的一项操作,但至少它应该始终有效!

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

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

答案 9 :(得分:7)

另一个单行:

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

答案 10 :(得分:6)

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

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

这应该只会切断最后一段。

答案 11 :(得分:6)

使用basename和extname方法,也可以通过path轻松完成此操作。

const path = require('path')

path.basename('test.txt', path.extname('test.txt'))

答案 12 :(得分:5)

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

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

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

答案 13 :(得分:5)

简单的一个:

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

答案 14 :(得分:3)

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

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. 这两种解决方案都适用于本地和服务器文件;
  3. 但我无法对其他答案的性能比较以及浏览器或操作系统兼容性做任何​​说明。

    工作代码段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);
    
      
    
    
    

答案 15 :(得分:3)

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。中进行了测试

答案 16 :(得分:2)

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

答案 17 :(得分:2)

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

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

答案 18 :(得分:0)

这是正则表达式派上用场的地方! Javascript的.replace()方法将采用正则表达式,您可以利用它来实现您想要的目标:

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

答案 19 :(得分: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'

答案 20 :(得分: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;
}

答案 21 :(得分:0)

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

答案 22 :(得分:0)

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

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

答案 23 :(得分:0)

我喜欢使用正则表达式来做到这一点。它简短易懂。

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查看

答案 24 :(得分:-1)

首先,您必须获取正确的文件扩展名,然后才能将其删除

尝试此代码

<!DOCTYPE html>
<html>
<body>
<p>Click the button to display the array values after the split.</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function getFileName(str){
    var res = str.split('.').pop();
    alert('filename: ' + str.replace('.' + res, ''));
    alert('extension: ' +res);
}
function myFunction() {
    getFileName('abc.jpg');
    getFileName('abc.def.jpg');
    getFileName('abc.def.ghi.jpg');
    getFileName('abc.def.ghi.123.jpg');
    getFileName('abc.def.ghi.123.456.jpg');
    getFileName('abc.jpg.xyz.jpg'); // test with Sébastien comment lol
}
</script>
</body>
</html>

答案 25 :(得分:-2)

我会使用x.substring(0,x.lastIndexOf('。'))之类的东西。如果你想要表现,不要去javascript :-p不,还有一个声明对99.99999%的目的无关紧要。