如何在JavaScript中修改string的文件扩展名?

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

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

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

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

不知道什么样的执行速度会更快,但是如果像.jpeg.html这样的扩展名会更可靠

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

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

编辑:

要回答…当然,如果你总是有一个扩展名为.jpgx.length-4会工作得很好。

但是,如果您不知道扩展的长度,那么许多解决scheme中的任何一个都会更好/更强大。

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

要么

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

要么

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

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

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

或(也只有一个点)

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

node.js中 ,没有扩展名的文件的名字可以如下获得。

 var path = require('path'); var filename = 'hello.html'; path.parse(filename).name; // hello path.parse(filename).ext; // .html 

Node.js 文档页面的进一步解释。

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

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

如果文件没有扩展名,它将返回空string。 修复使用这个function

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

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

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

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

即使分隔符不存在于string中,也可以使用。

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

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

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

另一个单线:

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

这是另一个基于正则expression式的解决scheme:

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

这应该只砍掉最后一段。

简单的一个:

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

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

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

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

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

 name = filename.split("."); // trimming with pop() name.pop(); // getting the name with join() name.join(''); // empty string since default separator is ', ' 

这不只是我知道的一个操作,但至less它应该始终工作!

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

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

结果将是名称==“文件名” ;

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

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

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

结果将是name ==“文件名” ,与上面相同;

笔记:

  1. 第一个是慢一点,导致更多的操作; 但在两种情况下都起作用,换句话说,它可以从包含path或文件名的给定string中抽取文件名,而不用扩展名。 而第二个工作,只有当给定的variables包含一个文件名与文件名如扩展名为文件名。但稍快一点。
  2. 这两种解决scheme都适用于本地和服务器文件;

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

工作片段1:完整的path

 var thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"; theName = thePath.split("/").slice(-1).join().split(".").shift(); alert(theName); 
  
 var fileName = "something.extension"; fileName.slice(0, -path.extname(fileName).length) // === "something" 

这是正则expression式派上用场的地方! Javascript的.replace()方法将采用正则expression式,您可以利用它来完成你想要的:

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

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

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

这是我用来从文件名中删除扩展名的代码,不使用正则expression式或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 { substrings.pop(); // remove the last element var name = substrings.join(""); // rejoin the remaining elements without separator return name; } 

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

我会使用像x.substring(0,x.lastIndexOf('。'))。 如果你要performance的话,不要去寻找javascript:-p不,再多一个声明对于99.99999%的所有目的来说并不重要。