例如,假设x = filename.jpg,我想要获取filename,其中filename可以是任何文件名(为了简化,我们假设文件名只包含[a-zA-Z0-9-_])。
我看到x.substring(0, x.indexOf('.jpg'))在DZone片段上,但x.substring(0, x.length-4)不会表现更好吗?因为,length是一个属性,不做字符检查,而indexOf()是一个函数,做字符检查。
例如,假设x = filename.jpg,我想要获取filename,其中filename可以是任何文件名(为了简化,我们假设文件名只包含[a-zA-Z0-9-_])。
我看到x.substring(0, x.indexOf('.jpg'))在DZone片段上,但x.substring(0, x.length-4)不会表现更好吗?因为,length是一个属性,不做字符检查,而indexOf()是一个函数,做字符检查。
当前回答
如果你必须处理一个包含完整路径的变量(例如: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 ()
如果你必须只处理文件名及其扩展名(例如:thenamewitext = "filename.jpg"):
theName = theNameWithExt.split(".").shift();
结果将是name == "filename",与上面相同;
注:
第一个稍微慢一点,因为执行得更多 操作;但在两种情况下都有效,换句话说,它可以提取 没有扩展名的文件名来自一个给定的字符串,该字符串包含一个路径或一个带有ex的文件名。而第二种方法仅适用于给定变量包含一个带有ext的文件名,如filename。Ext,但是稍微快一点。 这两种解决方案都适用于本地和服务器文件;
但我不能说与其他答案的性能比较,也不能说浏览器或操作系统的兼容性。
工作片段1:完整路径 var thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"; name = thePath.split(“/”).slice (1) . join () .split(“。”).shift (); 警报(name);
工作片段2:具有扩展名的文件名 var thenamewiext = "filename.jpg"; name = theNameWithExt.split(“/”).slice (1) . join () .split(“。”).shift (); 警报(name);
工作代码段2:具有双扩展名的文件名 var thenamewiext = "filename.tar.gz"; name = theNameWithExt.split(“/”).slice (1) . join () .split(“。”).shift (); 警报(name);
其他回答
如果你使用的是Node.js,一个简单的答案就是第一条注释。 我的任务是我需要从Node服务器中删除Cloudinary中的一个图像,我只需要获得图像名称。 例子:
const path = require("path")
const image=xyz.jpg;
const img= path.parse(image).name
console.log(img) // xyz
简单的一个:
var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;
另一个一行程序:
x.split(".").slice(0, -1).join(".")
如果你必须处理一个包含完整路径的变量(例如: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 ()
如果你必须只处理文件名及其扩展名(例如:thenamewitext = "filename.jpg"):
theName = theNameWithExt.split(".").shift();
结果将是name == "filename",与上面相同;
注:
第一个稍微慢一点,因为执行得更多 操作;但在两种情况下都有效,换句话说,它可以提取 没有扩展名的文件名来自一个给定的字符串,该字符串包含一个路径或一个带有ex的文件名。而第二种方法仅适用于给定变量包含一个带有ext的文件名,如filename。Ext,但是稍微快一点。 这两种解决方案都适用于本地和服务器文件;
但我不能说与其他答案的性能比较,也不能说浏览器或操作系统的兼容性。
工作片段1:完整路径 var thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"; name = thePath.split(“/”).slice (1) . join () .split(“。”).shift (); 警报(name);
工作片段2:具有扩展名的文件名 var thenamewiext = "filename.jpg"; name = theNameWithExt.split(“/”).slice (1) . join () .split(“。”).shift (); 警报(name);
工作代码段2:具有双扩展名的文件名 var thenamewiext = "filename.tar.gz"; name = theNameWithExt.split(“/”).slice (1) . join () .split(“。”).shift (); 警报(name);
即使在字符串中不存在分隔符时,这也是有效的。
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 + ""
}