在Javascript中需要一个basename函数

Pet*_*Mmm 46 javascript string

我需要一个简短的基本名称功能(单线程?)用于Javascript:

basename("/a/folder/file.a.ext") -> "file.a"
basename("/a/folder/file.ext") -> "file"
basename("/a/folder/file") -> "file"
Run Code Online (Sandbox Code Playgroud)

这应该剥离路径和任何扩展.

更新:对于开头的点将很好地视为"特殊"文件

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
Run Code Online (Sandbox Code Playgroud)

Niv*_*vas 68

function baseName(str)
{
   var base = new String(str).substring(str.lastIndexOf('/') + 1); 
    if(base.lastIndexOf(".") != -1)       
        base = base.substring(0, base.lastIndexOf("."));
   return base;
}
Run Code Online (Sandbox Code Playgroud)

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


小智 64

function basename(path) {
   return path.split('/').reverse()[0];
}
Run Code Online (Sandbox Code Playgroud)

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

  • `path.split(/ [\\ /] /).pop();` - 适用于两个分隔符,无需反转 (131认同)
  • 3DFace的评论应该是公认的答案. (15认同)
  • 那个尴尬的时刻,第一条评论的票数比答案和接受的答案都多 0_o +1 @3DFace (8认同)

Eug*_*scu 23

任何上述工作虽然他们不尊重速度/记忆:-).

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

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

function basename(str, sep) {
    return str.substr(str.lastIndexOf(sep) + 1);
}
Run Code Online (Sandbox Code Playgroud)

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

function strip_extension(str) {
    return str.substr(0,str.lastIndexOf('.'));
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

basename('file.txt','/'); // real basename
strip_extension(basename('file.txt','/')); // custom basename
Run Code Online (Sandbox Code Playgroud)

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

  • 这是最准确、最优的答案。谢谢! (2认同)

Ran*_*ndy 11

如果可以,也许尝试使用现有的包. 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'
Run Code Online (Sandbox Code Playgroud)

其他例子:

var pathString = path.dirname(str);
var fileNameStringWithExtention = path.basename(str);
var fullPathAndFileNameString = path.join(pathString, fileNameString);
Run Code Online (Sandbox Code Playgroud)

  • @Randy:正是我需要的!在 nodejs 下,无需重新发明轮子。(@Tazo,你下载错了。它已经在那里了。) (3认同)

use*_*291 7

 basename = function(path) {
    return path.replace(/.*\/|\.[^.]*$/g, '');
 }
Run Code Online (Sandbox Code Playgroud)

替换以斜线.*\/或点结尾的任何东西- 一些非圆点 - \.[^.]*$没有任何结尾