使用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,这不是我需要的。另外,如果可能的话,我想避免使用正则表达式解决方案。
任何帮助将不胜感激,谢谢!
答案 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');
如果没有'./'或'../',则字符串将保持不变。