JS:从相对路径中删除前导斜杠,点

时间:2012-04-03 08:48:30

标签: javascript relative-path filepath

使用Javascript如何从相对路径中删除任意数量的“../”?

例如:

Before - '../../../folder1/folder2/my-file.php'
After  - 'folder1/folder2/my-file.php'

Before - '../folder1/my-file.php'
After  - 'folder1/my-file.php'

我在这里和谷歌搜索了多个关键词,似乎无法找到基于Javascript的解决方案,大多数是PHP,这不是我需要的。另外,如果可能的话,我想避免使用正则表达式解决方案。

任何帮助将不胜感激,谢谢!

5 个答案:

答案 0 :(得分:5)

  

另外,如果可能的话,我想避免使用正则表达式解决方案。

在JavaScript中,正则表达式可能是执行此操作的最佳方式;但你可以用循环代替它:

var str = "../../../folder1/folder2/my-file.php";
var result = str;
while (result.substring(0, 3) === "../") {
    result = result.substring(3);
}

使用正则表达式和String#replace

var str = "../../../folder1/folder2/my-file.php";
var result = str.replace(/^(?:\.\.\/)+/, "");

该正则表达式表示:匹配字符串的开头(^),然后匹配一个或多个../子字符串,并将其替换为""(例如,无)。你需要反斜杠,因为./都是正则表达式文字中的特殊字符,但我们希望它们在字符串中实际为./(?:___)构造将这三个字符组合在一起而不形成捕获组。

有关MDC上的正则表达式的更多信息,或specification中的(非常不太清楚)的正则表达式。

答案 1 :(得分:3)

var source = '../../../folder1/folder2/my-file.php';
    after = source.replace(/\.\.\//g, '');

console.log(after);

答案 2 :(得分:0)

如果您确定您的文件夹名称是常量,则可以使用子字符串

var str = "../../../folder1/folder2/my-file.php";
var result = str.substring(str.indexOf('folder1'));
console.log(result);

答案 3 :(得分:0)

这是一种非正则表达式方法:

var chunks = str.split('/');
var result = '';
var alternative = [];
for(var i=0;i<chunks.length;i++)
{
    if(chunks[i] !== '.' && chunks[i]!=='..')
    {
        result += chunks[i]+(i <(chunks.length -1) ? '/' : '');
        alternative.push(chunks[i]);
    }
}
alternative = alternative.join('/');

结果和替代方案是folder1/folder2/my-file.php 这很像T.J.克劳斯回答说,除了像./somescript.php这样的路径将从最初的./中剥离出来......这有点提高了安全性......

答案 4 :(得分:0)

如果您没有使用正则表达式,可以使用字符串lastIndexOf方法:

function pathStrip(url){
    ax= url.lastIndexOf('./')+1;
    return ax? url.substring(ax+1):url;
}

pathStrip( '../../../的folder1 /文件夹2 /我的-file.php');

如果没有'./'或'../',则字符串将保持不变。