今天群里出了个题目,原题如下:
求一函数
原字符串为
var str = "aaa/bbb/ccc/"
如果用户输入
'../dd.js'
那么返回
aaa/bbb/dd.js
如果用户输入
'../../ee.js'
那么返回
aaa/ee.js
如果用户输入
'../../../hh.js'
那么返回
hh.js
function adjustPath(str, user){
}
另外应群里童鞋处理特许情况,又需要处理一下情况
URL中存在
./
,例如:../..//xx.js
URL中存在
//
,例如:./ii.js
其实对于这题,很早以前就看到过,只是一直没去花时间,正好今天早上闲着,就写了个:
function absPath(str, user){
var sCount = 0;
var url = (user + '').replace(/\.\.\//g, function(){
sCount++;
return '';
})
.replace(/\.\//g, '');
str = (str + '').replace(/\/+$/, '');
str = str.split('/').slice(0, sCount > 0 ? -sCount : void 0).join('/');
url = str.length > 0 ? str + '/' + url : url;
return url.replace(/\/\/+/g, '/');
}
在以上代码发出去后,群里影响几乎为 0 的情况下,出去喝了杯水,想到应该得出点奇淫技巧了,于是就又有了:
//MS 还是比较给力的
function absPath(str, user){
var a = document.createElement('a');
a.href = str + user;
//console.info('getAttribute, href = ', a.getAttribute('href', 4));
var urlPri = location.href.slice(0, location.href.lastIndexOf('/') + 1);
//实际只有IE7- 需要 a.getAttribute('href', 4) 取得浏览器拼接好的URL
return (!-[1,] ? a.getAttribute('href', 4) : a.href).replace(urlPri, '');
}
测试代码如下:
console.warn('test 1 - ', absPath('aaa/bbb/ccc/', '../dd.js'));
console.warn('test 2 - ', absPath('aaa/bbb/ccc/', '../../ee.js'));
console.warn('test 3 - ', absPath('aaa/bbb/ccc/', '../../../hh.js'));
console.warn('test 4 - ', absPath('aaa/bbb/ccc/', '../..//xx.js'));
console.warn('test 5 - ', absPath('aaa/bbb/ccc/', './ii.js'));
最后给出群里 "糖果男孩" 的一个比较给力函数,不过如果需要支持上面说的几个特许情况,还得改造一下:
function adjustPath(str, user){
var patharr = str.replace(/\/$/,"").split("\/");
var nstr = user.replace(/\.\.\//g,function(){
patharr.pop();
return "";
});
return patharr.join("/")+"/"+nstr;
}
共0评论