Entfernen Sie alles vor dem letzten Auftreten eines Zeichens

73

Ich versuche, die folgende Aktion für eine Zeichenfolge auszuführen:

  • finde das letzte Vorkommen des Charakters "/";
  • entferne alles vor diesem Zeichen;
  • Geben Sie die Reste der Zeichenfolge zurück.

Nehmen wir an, ich habe die folgende Zeichenfolge:

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

Was ich jetzt herausziehen muss, ist alles außer der eigentlichen Seite, so etwas in der Art:

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

Das ist natürlich nur ein Beispiel, denn natürlich werde ich verschiedene Seiten haben, aber es gelten die gleichen Prinzipien.

Ich fragte mich, ob mir jemand bei einer Lösung helfen könnte. Ich habe die nächsten Aktionen ausprobiert, aber ohne Erfolg:

var location = window.location.pathname;
var result = location.substring(location.lastIndexOf["/"]);
Roland
quelle
2
Du warst nah. lastIndexOfist eine Funktion und kann nicht überschrieben werden, locationwenn es sich um eine globale Variable handelt. So sollte es sein: loc.substring(loc.lastIndexOf("/"))und da Sie den Schrägstrich selbst nicht einfügen möchten : loc.substring(loc.lastIndexOf("/") + 1).
Felix Kling

Antworten:

111

Sie haben die richtige Idee, ersetzen Sie einfach die Klammern durch Klammern.

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

Hier ist ein Beispiel in jsfiddle und hier eine Erklärung der .lastIndexOf () -Methode im Mozilla Developer Network .

Jewgeni Simkin
quelle
Oh, das habe ich nicht bemerkt :)
Roland
8
Das würde alles nach dem letzten Auftreten entfernen . OP möchte alles vorher entfernen . Es sollte eigentlich sein location.substring(location.lastIndexOf("/") + 1).
Felix Kling
Das ist, was ich benutze, außer dem 0dort, das das Gegenteil von dem tun würde, was ich brauche :)
Roland
Entschuldigung Roland, ich habe Ihre Frage falsch verstanden und dachte, Sie wollten alles bis zum Schrägstrich. Ja, entfernen Sie einfach den 0-Parameter und Sie haben das, was Sie wollen. Ihr einziges Problem waren die falschen Klammern.
Jewgeni Simkin
Ich denke, dass Michaels Antwort hier die bessere ist, weil Sie auf eine Ausnahme stoßen werden, wenn Sie jemals eine Zeichenfolge übergeben, die kein "/" enthält und die Zeile am -1 erstickt. Also, zumindest wollen Sie mit meiner Bearbeitung schützen ...
Jewgeni Simkin
11

Persönlich würde ich einen regulären Ausdruck verwenden:

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

Wenn Sie mit regulären Ausdrücken vertraut sind (und Sie sollten es sein, wenn nicht :-), dann sieht es nicht so fremd aus wie wenn sie nicht vertraut sind.

Der führende ^erzwingt diesen regulären Ausdruck, um die Übereinstimmung am Anfang der Zeichenfolge zu "verankern". Das \/entspricht einem einzelnen /Zeichen (das \soll verhindern, dass der /Parser für reguläre Ausdrücke verwirrt wird). Dann (.*)$passt alles andere von der /bis zum Ende des Strings. Die Initiale .*wird so viel wie möglich verschluckt, einschließlich der /Zeichen vor der letzten. Der Ersatztext "$1"ist ein spezielles Formular, das "den Inhalt der ersten übereinstimmenden Gruppe" bedeutet. Diese Regex hat eine Gruppe, die durch die Klammern um das letzte .*(in (.*)$) gebildet wird. Das wird alles nach dem letzten sein/Das Gesamtergebnis ist also, dass die gesamte Zeichenfolge durch genau dieses Zeug ersetzt wird. (Wenn das Muster nicht übereinstimmt, weil keine /Zeichen vorhanden sind, geschieht nichts.)

Spitze
quelle
Nein, ich bin damit vertraut, ich benutze es in PHP, aber weniger in JS
Roland
10

Teilen Sie den String in ein Array auf /und .pop()neben dem letzten Element. Beachten Sie, dass Sie zuerst einen abschließenden Schrägstrich entfernen müssen, falls vorhanden.

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());

Wenn im Fall einer URL wie der, /path/stuff/here/in der Sie das Trailing haben /, in diesem Fall eine leere Zeichenfolge zurückgegeben werden soll here, ändern Sie die obigen Angaben, um die .replace()aus der Aufrufkette zu entfernen . Ich nahm an, dass Sie die letzte Komponente unabhängig von einem abschließenden Schrägstrich möchten, aber möglicherweise falsch angenommen haben.

console.log(locationstring.split('/').pop());
Michael Berkowski
quelle
Ich denke, meine Lösung ist sauberer, aber in jedem Fall müssten Sie dieses Array auf "/" wieder zusammenfügen, oder Sie würden mit Teilen ohne das / enden.
Jewgeni Simkin
Ich benutze es lieber nicht .pop():)
Roland
@DR. Dredel the OP braucht nicht den Rest der Saite, nur den letzten Teil, also keine Notwendigkeit, ihn wieder zusammenzufügen
Michael Berkowski
Oh, ich habe die Frage falsch verstanden (oder vielleicht das OP bearbeitet? Nicht sicher). Ich dachte, er wollte alles bis zum letzten Schrägstrich. Ihr Ansatz ist offensichtlich in Ordnung für die angegebene Frage.
Jewgeni Simkin
@ Dr.Dredel Ich stimme zu, es gab Verwirrung bei der Frage, ob "alles bis zu" extrahiert werden soll - wenn Sie extrahieren , möchten Sie es normalerweise behalten, aber in diesem Fall sollte es lauten: "Alles bis zu entfernen". .
Michael Berkowski
2
    var result = /\/([^\/]*)$/.exec(location)[1];

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

Hinweis: locationHier ist die window.location, nicht Ihre var location.

Esailija
quelle
-1
var string = "/Roland/index.php";
var result = string.substring(0, string.lastIndexOf("/") + 0);
Ashish Gupta
quelle