2

我想实现一个实用方法,可以用来解析相对路径。该方法应使用 JavaScript RegExp 实现,算法要求如下:

1) 删除所有出现的“/../”,其中是不等于“..”的完整路径段。迭代地执行这些路径段的移除,在每次迭代中移除最左边的匹配模式,直到没有匹配模式剩余。

2)如果路径以“/..”结尾,其中不等于“..”的完整路径段,则删除“/..”。

例子:

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”,那我该如何纠正呢?

请帮帮我!

4

2 回答 2

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('/');
}
于 2013-07-31T10:53:23.840 回答
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);
}
于 2013-07-31T11:04:40.990 回答