Using Javascript how would I remove any number of "../" from a relative path?
For instance:
Before - '../../../folder1/folder2/my-file.php'
After - 'folder1/folder2/my-file.php'
Before - '../folder1/my-file.php'
After - 'folder1/my-file.php'
I've searched multiple keywords both here and at Google and can't seem to find a Javascript based solution, most are PHP which is not what I'm needing. Also, I'd like to avoid a regex solution if possible.
Any help would be appreciated, thanks!
Using Javascript how would I remove any number of "../" from a relative path?
For instance:
Before - '../../../folder1/folder2/my-file.php'
After - 'folder1/folder2/my-file.php'
Before - '../folder1/my-file.php'
After - 'folder1/my-file.php'
I've searched multiple keywords both here and at Google and can't seem to find a Javascript based solution, most are PHP which is not what I'm needing. Also, I'd like to avoid a regex solution if possible.
Any help would be appreciated, thanks!
Share Improve this question asked Apr 3, 2012 at 8:48 BD_DesignBD_Design 2695 silver badges13 bronze badges6 Answers
Reset to default 8Also, I'd like to avoid a regex solution if possible.
In JavaScript, a regular expression is probably the best way to do this; but you could do it with a loop instead:
var str = "../../../folder1/folder2/my-file.php";
var result = str;
while (result.substring(0, 3) === "../") {
result = result.substring(3);
}
Using a regular expression and String#replace
:
var str = "../../../folder1/folder2/my-file.php";
var result = str.replace(/^(?:\.\.\/)+/, "");
That regular expression says: Match the start of the string (^
) and then one or more ../
substrings, and replace them with ""
(e.g., nothing). You need the backslashes in there because both .
and /
are special characters in regular expression literals, but we want them to actually be .
and /
in your string. The (?:___)
construct groups those three characters together without forming a capture group.
More on regular expressions on MDC or (much, much less clearly) in the specification.
var source = '../../../folder1/folder2/my-file.php';
after = source.replace(/\.\.\//g, '');
console.log(after);
If you are not wedded to regular expressions you can use the string lastIndexOf method:
function pathStrip(url){
ax= url.lastIndexOf('./')+1;
return ax? url.substring(ax+1):url;
}
pathStrip('../../../folder1/folder2/my-file.php');
If there are no './' or '../' the string is returned unchanged.
If you are sure about your folder name to be constant you can use substring
var str = "../../../folder1/folder2/my-file.php";
var result = str.substring(str.indexOf('folder1'));
console.log(result);
If someone would like also to remove a single leading dot with multiple leading dot
use this regex
str.replace(/^(?:\.\.\/|\.\/)+/, '')
I just updated the regex that @.J. Crowder mentioned above by adding |\.\/
so it also match any "dots" followed by single "slash"
Here's a non-regex approach:
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('/');
Result and alternative will be folder1/folder2/my-file.php
This is much like T.J. Crowders answer, except paths like ./somescript.php
will be stripped from their initial ./
aswell... which somewhat improves safety...