如何使用 JavaScript 从完整路径获取文件名?

IT技术 javascript
2021-01-17 11:54:14

有没有办法从完整路径中获取最后一个值(基于“\”符号)?

例子:

C:\Documents and Settings\img\recycled log.jpg

在这种情况下,我只想recycled log.jpg从 JavaScript 中获取完整路径。

6个回答
var filename = fullPath.replace(/^.*[\\\/]/, '')

这将处理路径中的 \ OR /

不适用于 MAC OSX,使用 chrome,它在 \ 后转义字符
2021-03-14 11:54:14
根据这个网站,使用replace多少慢于substr,它可与结合使用lastIndexOf('/')+1jsperf.com/replace-vs-substring
2021-03-16 11:54:14
我只是在我的控制台上运行它,它非常适合正斜杠:"/var/drop/foo/boo/moo.js".replace(/^.*[\\\/]/, '')返回moo.js
2021-04-02 11:54:14
@ZloySmiertniy 有几个不错的在线正则表达式解释器。rick.measham.id.au/paste/explain.pl?regex=%2F%5E .*%5B%5C%5C%5C%2F%5D%2F 和regexper.com/#%2F%5E .*%5B %5C%5C%5C%2F%5D%2F 应该会有所帮助。(此处链接已断开,但复制粘贴到选项卡中即可使用)
2021-04-05 11:54:14
@nickf Nick,不确定我哪里出错了,但是当文件路径有单斜杠时,代码对我不起作用。Fiddle,虽然对于`\\`,它工作正常。
2021-04-10 11:54:14

只是为了性能,我测试了这里给出的所有答案:

var substringTest = function (str) {
    return str.substring(str.lastIndexOf('/')+1);
}

var replaceTest = function (str) {
    return str.replace(/^.*(\\|\/|\:)/, '');
}

var execTest = function (str) {
    return /([^\\]+)$/.exec(str)[1];
}

var splitTest = function (str) {
    return str.split('\\').pop().split('/').pop();
}

substringTest took   0.09508600000000023ms
replaceTest   took   0.049203000000000004ms
execTest      took   0.04859899999999939ms
splitTest     took   0.02505500000000005ms

获胜者是Split 和 Pop风格的答案,感谢bobince

测试不正确。substringTest 只搜索正斜杠,execTest - 只搜索反斜杠,而剩下的两个处理两个斜杠。和实际结果不相关(不再)。看看这个:jsperf.com/name-from-path
2021-03-15 11:54:14
根据元讨论,请在其他答案中添加适当的引文。更好地解释您如何分析运行时也将很有帮助。
2021-03-16 11:54:14
也可以随意对这个版本进行基准测试。应支持 Mac 和 Windows 文件路径。path.split(/.*[\/|\\]/)[1];
2021-03-25 11:54:14
@Grief 该链接不再有效。
2021-04-03 11:54:14

在 Node.js 中,你可以使用Path 的 parse module...

var path = require('path');
var file = '/home/user/dir/file.txt';

var filename = path.parse(file).base;
//=> 'file.txt'
如果使用 Node.js 你可以只使用basename函数:path.basename(file)
2021-04-04 11:54:14

路径来自哪个平台?Windows 路径不同于 POSIX 路径不同于 Mac OS 9 路径不同于 RISC OS 路径不同...

如果它是一个文件名可以来自不同平台的网络应用程序,则没有一种解决方案。然而,合理的方法是同时使用 '\' (Windows) 和 '/'(Linux/Unix/Mac 以及 Windows 上的替代方案)作为路径分隔符。这是一个非 RegExp 版本的额外乐趣:

var leafname= pathname.split('\\').pop().split('/').pop();
您可能想添加经典的 MacOS (<= 9) 使用冒号分隔符 (:),但我不知道可能仍在使用的任何浏览器没有将 MacOS 路径转换为文件形式的 POSIX 路径:///path/to/file.ext
2021-03-12 11:54:14
命名“名”是从目录导出/文件结构名字“树”的第一件事,最后是树叶=>文件名中的最后一件事路径=>:-)
2021-03-12 11:54:14
您可以只使用 pop() 而不是 reverse()[0]。它也会修改原始数组,但在您的情况下没问题。
2021-03-19 11:54:14
我想知道我们如何创建一个对应物来获取路径。
2021-03-20 11:54:14
就像是 var path = '\\Dir2\\Sub1\\SubSub1'; //path = '/Dir2/Sub1/SubSub1'; path = path.split('\\').length > 1 ? path.split('\\').slice(0, -1).join('\\') : path; path = path.split('/').length > 1 ? path.split('/').slice(0, -1).join('/') : path; console.log(path);
2021-03-24 11:54:14

Ates,您的解决方案不能防止空字符串作为输入。在这种情况下,它失败了TypeError: /([^(\\|\/|\:)]+)$/.exec(fullPath) has no properties

bobince,这是处理 DOS、POSIX 和 HFS 路径分隔符(和空字符串)的 nickf 版本:

return fullPath.replace(/^.*(\\|\/|\:)/, '');
如果我们用 PHP 编写这段 JS 代码,我们需要为每个 \ 添加一个额外的 \
2021-03-23 11:54:14