2013-07-31 81 views
2

我想實現一個實用程序方法,它可以用來解析相對路徑。 該方法應該使用JavaScript正則表達式來實現,並且需要該算法如下:如何使用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「,那我該如何糾正它?

請幫我一把!

回答

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('/'); 
} 
+0

你爲什麼不用'i = 1'開頭? – jantimon

+0

這不會給'a/b/css /../ ..' – SmokeyPHP

+0

'return parts.join('/')+(parts [parts.length -1] === undefined?' /':'');' – jantimon

0

這似乎做你想要什麼,但Felix的答案也應該足夠了一次微調。

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); 
} 
+0

非常感謝你!我測試過了,「../../a/bss/../../」結果爲空,應該是「../../」嗎? – lmnbeyond