我想实现一个实用程序方法,可用于解析相对路径。 该方法应使用JavaScript RegExp实现,并且算法如下所示:
1)所有出现的“段 /../”,其中段是 完全路径段不等于“..”,将被删除。 迭代地执行这些路径段的移除, 删除每次迭代时最左边的匹配模式, 直到没有匹配的模式。
2)如果路径以“/ ..”结尾,则其中a为 完整路径段不等于“..”,即 “/ ..”已删除。
示例:
a/b/css/../../d ==> a/d
a/b/c.ss/../../d ==> a/d
a/b/css/../.. ==> a/
a/bss/../../../ ==> ../
../../../ ==> ../../../
我试图实现这种方法:
var result = "a/b/c.ss/../../d";
while(result.indexOf('..') >= 0)
{
var temp = result.replace(/([^\.\/]*)\/\.\.\/?/,'');
if (temp == result){
break;
}
result = temp;
}
但是它不能处理“a / b / c.ss /../../ d”,那我怎么纠正呢?
请帮帮我!
答案 0 :(得分:3)
我不会使用正则表达式。我会在/
上拆分路径,然后迭代数组并相应地删除元素。
例如:
function resolve(path) {
var parts = path.split('/');
var i = 1;
while (i < parts.length) {
// if current part is `..` and previous part is different, remove
// both of them
if (parts[i] === '..' && i > 0 && parts[i-1] !== '..') {
parts.splice(i-1, 2);
i -= 2;
}
i++
}
return parts.join('/');
}
答案 1 :(得分:0)
这似乎可以做你想要的,虽然菲利克斯的答案一旦调整也应该运作良好。
var tests = ['a/b/css/../../d','a/b/c.ss/../../d','a/b/css/../..','a/bss/../../../','../../../']
for(var i in tests)
{
var result = tests[i];
//you want from here..
while(result.indexOf('..') >= 0 && result.match(/^\/?(\.\.\/)+\/?$/)==null)
{
var temp = result.replace(/([^\/]*)\/\.\.\/?/,'');
if (temp == result){
break;
}
result = temp;
}
//..to here
console.log(tests[i]+' |->| '+result);
}