今天群里出了个题目,原题如下:
求一函数
原字符串为
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.jsURL中存在
//,例如:./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评论