[英]Getting just the filename from a path with JavaScript
我有一个图像的完整路径,我使用 jQuery 来读取它:
$('img.my_image').attr('src');
但是我只想要文件名部分(即没有完整路径)。
是否有任何内置函数可以做到这一点,或者正则表达式是唯一的选择?
var Filename= path.split('/').pop()
var fileNameIndex = yourstring.lastIndexOf("/") + 1;
var filename = yourstring.substr(fileNameIndex);
function getFileName(path) {
return path.match(/[-_\w]+[.][\w]+$/i)[0];
}
我找到了一个更好的版本来处理 unix 和类似 windows 的路径字符串。
1号:
var unix_path = '/tmp/images/cat.jpg';
console.log(unix_path.replace(/^.*[\\\/]/, ''));
var win_path = 'c:\\temp\images\cat.jpg';
console.log(win_path.replace(/^.*[\\\/]/, ''));
输出将是cat.jpg
2号:(也许更快)
var unix_path = '/tmp/images/cat.jpg';
console.log(unix_path.split(/[\\\/]/).pop());
var win_path = 'c:\\temp\images\cat.jpg';
console.log(win_path.split(/[\\\/]/).pop());
输出将是cat.jpg
在 Javascript 你可以做
function getFileNameFromPath(path) {
var ary = path.split("/");
return ary[ary.length - 1];
}
使用此解决方案,您可以获得两个名称,即带有和不带有文件扩展名。
//getting image source var path=$('img.my_image').attr('src'); //splitting url and getting filename with file extension var file=path.split('/').pop(); //removing extension and keeping just the filename var filename=file.split('.').shift();
除了接受的答案。 看起来这里是最快的跨平台(Unix 和 Windows)解决方案:
function basePath(path) {
return path.substr(
Math.max(
path.lastIndexOf('\\'),
path.lastIndexOf('/'),
) + 1,
);
}
当您拥有来自 Unix 和 Windows 的数据并且我们必须在一个地方进行解析时,这是必要的。
此函数仅采用所有可能的分隔符中的最新一个,并在最后一个分隔符之后返回字符串。 大字符串要快得多,这就是为什么:
在 Chromex87 中测试:
// Test subjects //===================== function basePathUnix(path) { return path.split('/').pop(); } function basePathUnix2(path) { const arr = path.split('/'); return arr[ arr.length - 1 ]; } function basePathUnix3(path) { return path.substr(path.lastIndexOf('/') + 1); } function basePathCrossPlatform(path) { return path.replace(/^.*[\\\\\\/]/, ''); } function basePathCrossPlatform2(path) { return path.split(/[\\\\\\/]/).pop(); } function basePathCrossPlatform3(path) { return path.substr(Math.max(path.lastIndexOf('\\\\'), path.lastIndexOf('/')) + 1); } function basePathCrossPlatform4(path, separators = ['/', '\\\\']) { return path.substr(Math.max(...separators.map(s => path.lastIndexOf(s))) + 1); } // Tests //===================== function measureTime(name, fn) { const start = window.performance.now(); for (let i = 0; i < 10000; i++) { fn(); } const time = window.performance.now() - start; console.log(name, time); } function testResults(name, path) { console.log('\\n[CHECK RESULTS]', name); console.log('basePathUnix:\\t\\t', basePathUnix(path)); console.log('basePathUnix2:\\t\\t', basePathUnix2(path)); console.log('basePathUnix3:\\t\\t', basePathUnix3(path)); console.log('basePathCrossPlatform:\\t', basePathCrossPlatform(path)); console.log('basePathCrossPlatform2:\\t', basePathCrossPlatform2(path)); console.log('basePathCrossPlatform3:\\t', basePathCrossPlatform3(path)); console.log('basePathCrossPlatform4:\\t', basePathCrossPlatform4(path)); } function testPerformance(name, path) { console.log('\\n[MEASURE PERFORMANCE]', name); measureTime('basePathUnix:\\t\\t', () => basePathUnix(path)); measureTime('basePathUnix2:\\t\\t', () => basePathUnix2(path)); measureTime('basePathUnix3:\\t\\t', () => basePathUnix3(path)); measureTime('basePathCrossPlatform:\\t', () => basePathCrossPlatform(path)); measureTime('basePathCrossPlatform2:\\t', () => basePathCrossPlatform2(path)); measureTime('basePathCrossPlatform3:\\t', () => basePathCrossPlatform3(path)); measureTime('basePathCrossPlatform4:\\t', () => basePathCrossPlatform4(path)); } function runTest(name, path) { setTimeout(() => { testResults(name, path); setTimeout(() => { testPerformance(name, path); }, 200); }, 200); } // Run tests //===================== setTimeout(() => { const pathUnix = '/some/path/string/some/path/string/some/path/string/some/path/string/some/path/string/some/path/file-name'; runTest('UNIX', pathUnix); }, 1000); setTimeout(() => { const pathWind = '\\\\some\\\\path\\\\string\\\\some\\\\path\\\\string\\\\some\\\\path\\\\string\\\\some\\\\path\\\\string\\\\some\\\\path\\\\file-name'; runTest('WINDOWS', pathWind); }, 2000);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.