Ich suche das Äquivalent von "document.referrer.pathname". Ich weiß, dass es andere Fragen gibt, die bei SO ähnlich sind, aber keine von ihnen behandelt alle Anwendungsfälle. Beispielsweise:

http://example.com/RESULT

http://example.com/RESULT/

http://example.com/RESULT?query=string

Alle Beispiele sollten zurückkehren:

RESULT

Oder

https://example.com/EXTENDED/RESULT/

EXTENDED/RESULT

Einige Leute möchten vielleicht, dass der abschließende Schrägstrich enthalten ist, aber ich nicht, weil ich mit einer Liste von Verweisen übereinstimme.

Ich habe angefangen mit:

document.referrer.match(/:\/\/.*\/(.*)/)[1]

Und habe Probleme beim Hinzufügen der Analyse von Abfragezeichenfolgen.

Vielen Dank!

0
Spanky 21 Nov. 2012 im 04:44

3 Antworten

Beste Antwort

Versuchen Sie diesen regulären Ausdruck:

.match(/\/\/.*?\/(.*?)\/?(\?.*)?$/)[1]

DEMO

1
Brian Ustas 23 Nov. 2012 im 17:28

Wenn Sie URLs als Zeichenfolgen haben, können Sie leere Anker erstellen und ihnen die URL als href geben, um auf den Pfadnamen zuzugreifen:

var url = 'http://example.com/RESULT?query=string', // or document.referrer
    a = document.createElement('a');
a.href = url;
var result = a.pathname.replace(/(^\/|\/$)/g,'');

Ich habe hier ein Testbeispiel für Sie erstellt: http://jsfiddle.net/eWydy/

3
David Hellsing 21 Nov. 2012 im 01:09

Wenn Sie kein neues Element dafür erstellen oder sich auf a.pathname verlassen möchten, würde ich die Verwendung von indexOf und slice vorschlagen.

function getPath(s) {
    var i = s.indexOf('://') + 3, j;
    i = s.indexOf('/',i) + 1;  // find first / (ie. after .com) and start at the next char
    if( i === 0 ) return '';
    j = s.indexOf('?',i); // find first ? after first / (as before doesn't matter anyway)
    if( j == -1 ) j = s.length; // if no ?, use until end of string
    while( s[j-1] === '/' ) j = j - 1; // get rid of ending /s
    return s.slice(i, j); // return what we've ended up at
}
getPath(document.referrer);

Wenn Sie Regex wollen, vielleicht das hier

document.referrer.match(/:\/\/[^\/]+[\/]+([^\?]*)[\/]*(?:\?.*)?$/)[1]

Das "das erste :// findet, bis zum nächsten / weitermacht und dann alles bekommt, was kein ? ist, bis ein ? oder das letzte / oder Ende der Zeichenfolge und erfassen ", was im Grunde die gleiche ist wie die Funktion, die ich oben ausgeführt habe.

0
Paul S. 21 Nov. 2012 im 01:10