如何在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.jpeg
或filename.pl
?
编辑:
要回答…当然,如果你总是有一个扩展名为.jpg
, x.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 ==“文件名” ,与上面相同;
笔记:
- 第一个是慢一点,导致更多的操作; 但在两种情况下都起作用,换句话说,它可以从包含path或文件名的给定string中抽取文件名,而不用扩展名。 而第二个工作,只有当给定的variables包含一个文件名与文件名如扩展名为文件名。但稍快一点。
- 这两种解决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%的所有目的来说并不重要。