如何使用JavaScript RegExp来解析相对路径?

时间:2013-07-31 10:17:51

标签: javascript

我想实现一个实用程序方法,可用于解析相对路径。 该方法应使用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”,那我怎么纠正呢?

请帮帮我!

2 个答案:

答案 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);
}