基于给定路径求相对路径 - 凡事预则立,不预则废

今天群里出了个题目,原题如下:


求一函数
原字符串为
var str = "aaa/bbb/ccc/"
如果用户输入
'../dd.js'
那么返回
aaa/bbb/dd.js
如果用户输入
'../../ee.js'
那么返回
aaa/ee.js
如果用户输入
'../../../hh.js'
那么返回
hh.js
function adjustPath(str, user){

}

另外应群里童鞋处理特许情况,又需要处理一下情况

  1. URL中存在./,例如:../..//xx.js

  2. 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;
}
Tags:Javascript

0评论

发表评论

最新评论及回复

    loading

最近发表

    loading

网站分类

    loading

文章归档

    loading

友情链接

Top Comments Footer