在 Javascript 中需要一个 basename 函数

IT技术 javascript string
2021-03-05 04:40:58

我需要一个用于 Javascript 的短基名函数(单行?):

basename("/a/folder/file.a.ext") -> "file.a"
basename("/a/folder/file.ext") -> "file"
basename("/a/folder/file") -> "file"

那应该去掉路径和任何扩展名。

更新:对于开头的点,将其视为“特殊”文件会很好

basename("/a/folder/.file.a.ext") -> ".file.a"
basename("/a/folder/.file.ext") -> ".file"
basename("/a/folder/.file") -> ".file" # empty is Ok
basename("/a/folder/.fil") -> ".fil"  # empty is Ok
basename("/a/folder/.file..a..") -> # does'nt matter
6个回答
function basename(path) {
   return path.split('/').reverse()[0];
}

将路径分解为组件目录和文件名,然后返回最后一部分(文件名),它是数组的最后一个元素。

@3DFace在您的代码中‌​之间似乎有几个奇怪的字符 ( ) .pop()
2021-04-24 04:40:58
我认为你应该this在函数内部使用而不是变量 name 。所以不要只选择头等元素。
2021-04-25 04:40:58
@LarsNyström 这很奇怪,因为只有 ascii 字符。你的 URL 编码版本: path.split(%2F%5B%5C%5C%2F%5D%2F).pop()%3B 希望,你可以解码 :)
2021-04-27 04:40:58
path.split(/[\\/]/).pop(); - 适用于两个分隔符,无需反转
2021-05-07 04:40:58
那个尴尬的时刻,第一条评论的票数比答案和接受的答案都多 0_o +1 @3DFace
2021-05-13 04:40:58
function baseName(str)
{
   var base = new String(str).substring(str.lastIndexOf('/') + 1); 
    if(base.lastIndexOf(".") != -1)       
        base = base.substring(0, base.lastIndexOf("."));
   return base;
}

如果可以同时使用/\作为分隔符,则必须更改代码以再添加一行

为什么new String(str)需要而不仅仅是str.substring(...)
2021-04-26 04:40:58
@Sibidharan 你能详细说明一下吗?
2021-05-01 04:40:58

以上任何一种都有效,尽管它们不考虑速度/内存:-)。

一个更快/更简单的实现应该使用更少的功能/操作成为可能。RegExp 是一个糟糕的选择,因为它消耗了大量资源,而实际上我们可以实现相同的结果但更容易。

当您想要包含扩展名的文件名时的实现(实际上这是basename的真正定义):

function basename(str, sep) {
    return str.substr(str.lastIndexOf(sep) + 1);
}

如果您需要一个自定义的basename 实现也必须剥离扩展名,我会推荐一个特定的扩展剥离函数,您可以随时调用它。

function strip_extension(str) {
    return str.substr(0,str.lastIndexOf('.'));
}

用法示例:

basename('file.txt','/'); // real basename
strip_extension(basename('file.txt','/')); // custom basename

它们是分开的,因此您可以将它们组合起来以获得 3 种不同的东西:剥离扩展名、获取真实的基本名称、获取您的自定义基本名称。我认为它是比其他方法更优雅的实现。

这是最准确和最佳的答案。谢谢!
2021-04-19 04:40:58
如果你有扩展和不扩展的两种情况,我改变了 strip_extension 代码: return str.substr(0, (str.lastIndexOf('.')==-1) ? str.length : str.lastIndexOf('.'));
2021-05-07 04:40:58
速度只在循环内部很重要,尤其是最里面的循环。内存仅在同时分配多个对象,尤其是大对象时才重要。对于不是关键代码的“basename”函数,这个答案是完美的。
2021-05-14 04:40:58

如果可以的话,也许尝试使用现有的包。 http://nodejs.org/api/path.html

var path = require('path');
var str = '/path/to/file/test.html'

var fileNameStringWithoutExtention = path.basename(str, '.html');
// returns 'test'

// let path determine the extension
var fileNameStringWithoutExtention = path.basename(str, path.extname(str));
// returns 'test'

其他例子:

var pathString = path.dirname(str);
var fileNameStringWithExtention = path.basename(str);
var fullPathAndFileNameString = path.join(pathString, fileNameString);
@Randy:正是我需要的!在 nodejs 下,无需重新发明轮子。(@Tazo,你下载错了。它已经在那里了。)
2021-04-19 04:40:58
@Randy 我不知道为什么人们使用自定义函数来获取文件名而不是您所做的
2021-05-13 04:40:58
 basename = function(path) {
    return path.replace(/.*\/|\.[^.]*$/g, '');
 }

替换以斜杠.*\/或点结尾的任何内容- 一些非点 -\.[^.]*$以任何内容结尾