Roland
Roland

Reputation: 9691

remove everything before the last occurrence of a character

I'm trying to perform the following action on a string :

To be more explicit, let's say I have the following string :

var string = "/Roland/index.php"; // Which is a result of window.location.pathname

Now what I need to extract out of it is everything but the actual page, something like this :

var result = "index.php" // Which is what I need to be returned

Of course, that is just an example, because obviously I will have different pages, but the same principles apply.

I was wondering if someone could help me out with a solution for it. I tried the next actions but with no success :

var location = window.location.pathname;
var result = location.substring(location.lastIndexOf["/"]);

Upvotes: 87

Views: 78406

Answers (6)

aloisdg
aloisdg

Reputation: 23521

To know which one is the fastest I created a small benchmark. The regex is the slowest solution and using substring or slice with lastIndexOf is strictly faster than split with either pop or at.

so use:

loc.substring(loc.lastIndexOf("/") + 1);

Complete result:

result

Try it online!

Upvotes: 1

Ashish Gupta
Ashish Gupta

Reputation: 1241

var string = "/Roland/index.php";
var result = string.substring(0, string.lastIndexOf("/") + 0);

Upvotes: -1

Yevgeny Simkin
Yevgeny Simkin

Reputation: 28349

You have the right idea just replace the brackets with parentheses.

var string = "/Roland/index.php";
var result = string.substring(string.lastIndexOf("/") + 1);

Here is an example in jsfiddle and here is an explanation of the .lastIndexOf() method on the Mozilla Developer Network.

Upvotes: 128

Pointy
Pointy

Reputation: 413692

Personally I'd use a regular expression:

var result = string.replace(/^.*\/(.*)$/, "$1");

If you're familiar with regular expressions (and you should be if not :-) then it's not as alien-looking as it is when they're unfamiliar.

The leading ^ forces this regular expression to "anchor" the match at the start of the string. The \/ matches a single / character (the \ is to keep the / from confusing the regular expression parser). Then (.*)$ matches everything else from the / to the end of the string. The initial .* will swallow up as much as it can, including / characters before the last one. The replacement text, "$1", is a special form that means "the contents of the first matched group". This regex has a group, formed by the parentheses around the last .* (in (.*)$). That's going to be all the stuff after the last /, so the overall result is that the whole string is replaced by just that stuff. (If the pattern doesn't match because there aren't any / characters, nothing will happen.)

Upvotes: 15

Michael Berkowski
Michael Berkowski

Reputation: 270609

Split the string into an array on / and .pop() off the last element. Note, that you will first need to strip off a trailing slash if there is one.

var locationstring = window.location.pathname;
// replace() the trailing / with nothing, split on the remaining /, and pop off the last one
console.log(locationstring.replace(/\/$/, "").split('/').pop());

If in the case of a URL like /path/stuff/here/ where you have the trailing /, if that case should return an empty string rather than here, modify the above to remove the .replace() from the call chain. I assumed you would want the last component regardless of a trailing slash, but may have incorrectly assumed.

console.log(locationstring.split('/').pop());

Upvotes: 10

Esailija
Esailija

Reputation: 140210

    var result = /\/([^\/]*)$/.exec(location)[1];

//"remove-everything-before-the-last-occurrence-of-a-character#10767835"

Note: location here is the window.location, not your var location.

Upvotes: 2

Related Questions