Ultimo segmento di URL


228

Come ottengo l'ultimo segmento di un URL? Ho il seguente script che mostra l'URL completo del tag anchor fatto clic:

$(".tag_name_goes_here").live('click', function(event)
{
    event.preventDefault();  
    alert($(this).attr("href"));
});

Se l'URL è

http://mywebsite/folder/file

come ottengo solo per visualizzare la parte "file" dell'URL nella casella di avviso?


Di seguito è la mia soluzione di script java funzionante. Spero che aiuti. stackoverflow.com/a/38370175/610951
Ravi Shankar Kota

Risposte:


369

Puoi anche utilizzare la funzione lastIndexOf () per individuare l'ultima occorrenza del /carattere nel tuo URL, quindi la funzione substring () per restituire la sottostringa a partire da quella posizione:

console.log(this.href.substring(this.href.lastIndexOf('/') + 1));

In questo modo, eviterai di creare un array contenente tutti i segmenti di URL, come split()fa.


3
@oshirowanen, no, ma creerà un elemento array da ciascun segmento URL. Poiché sei interessato solo all'ultimo segmento, potrebbe essere inutile allocare molti elementi dell'array che non utilizzerai mai.
Frédéric Hamidi,

11
Ma se l'URL è diventato admin/store/tour/-1/così, sarà ''stringa?
Imposta Kyar Wa Lar il

1
@Set, forse più bello, sicuramente più lento.
Frédéric Hamidi,

1
cosa succede se l'URL contiene un /alla fine?
Sнаđошƒаӽ,

6
All'attenzione di: @Set Kyar Wa Lar Aug e @ Sнаđошƒаӽ Soluzione per url che contiene un /alla fine:var url = window.location.href.replace(/\/$/, ''); /* remove optional end / */ var lastSeg = url.substr(url.lastIndexOf('/') + 1);
Ross

151

var parts = 'http://mywebsite/folder/file'.split('/');
var lastSegment = parts.pop() || parts.pop();  // handle potential trailing slash

console.log(lastSegment);


Puoi spiegarmi come funziona? secondo la mia conoscenza .pop () usato per rimuovere l'ultimo elemento di un array. ma è qui che ha mostrato l'ultimo elemento del mio url !!
Ispira Shahin il

1
Dividi convertirà il tuo url in un array prendendo ciascuna sezione dell'url delimitato da '/'. Quindi l'ultimo segmento è l'ultimo elemento sia dell'array che dell'array creato successivamente.
Stephen

10
Questo non funzionerà se l'URL termina con un "/", ovverohttp://mywebsite/folder/file/
Peter Ludlow,

@PeterLudlow funziona in Chrome 76, per favore, puoi elaborarlo
zyrup

1
@PeterLudlow funziona perché una stringa vuota è falsa nell'estratto JS "" == falsein quel caso apre la parte dell'array con la stringa vuota
zyrup

86
window.location.pathname.split("/").pop()

2
semplice e facile. Grazie.
Krezaeim,

3
Perfetto e ordinato, ottimo
Babak Habibi l'

1
Risposta bella e pulita
Zarkys Salas,

1
Questo e 'esattamente quello che stavo cercando. Usando reazioni-router-dom questa è stata la soluzione più pulita che ho trovato per trovare l'ultima parte dell'URL che segue l'ultima barra /. console.log(history.location.pathname.split("/").pop()) Se c'è un modo migliore che vorrei sapere! Spero che questo commento possa portare più persone alla tua risposta. Grazie @ Dblock247
Tralawar il

Sidenote: non funziona se nell'URL sono impostati parametri di query (ad es .../file?var=value&foo=bar.). Questa soluzione risolve questo problema in un modo più robusto e moderno: stackoverflow.com/a/51795122/1123743
Sebastian Barth,

30

Solo un'altra soluzione con regex.

var href = location.href;
console.log(href.match(/([^\/]*)\/*$/)[1]);

Mi piace Grazie :).
Salil Sharma,

18

Javascript ha la suddivisione della funzione associata all'oggetto stringa che può aiutarti:

var url = "http://mywebsite/folder/file";
var array = url.split('/');

var lastsegment = array[array.length-1];

17

Le altre risposte possono funzionare se il percorso è semplice, costituito solo da semplici elementi del percorso. Ma quando contiene anche parametri di query, si rompono.

Meglio usare l' oggetto URL per questo invece di ottenere una soluzione più solida. È un'interpretazione analizzata del presente URL:

Ingresso: const href = 'https://stackoverflow.com/boo?q=foo&s=bar'

const segments = new URL(href).pathname.split('/');
const last = segments.pop() || segments.pop(); // Handle potential trailing slash
console.log(last);

Produzione: 'boo'

Funziona con tutti i browser più comuni. Solo il nostro IE morente non lo supporta (e non lo farà). Tuttavia, per IE è disponibile un polyfill (se ti interessa ).



8
var urlChunks = 'mywebsite/folder/file'.split('/');
alert(urlChunks[urlChunks.length - 1]);

5

Lo so, è troppo tardi, ma per altri: consiglio vivamente di usare il plugin jacquery PURL . La motivazione per PURL è che l'URL può essere segmentato anche da '#' (esempio: link angular.js), ad esempio l'URL potrebbe apparire come

    http://test.com/#/about/us/

o

    http://test.com/#sky=blue&grass=green

E con PURL puoi facilmente decidere (segmento / fsegment) quale segmento vuoi ottenere.

Per l'ultimo segmento "classico" puoi scrivere:

    var url = $.url('http://test.com/dir/index.html?key=value');
    var lastSegment = url.segment().pop(); // index.html

4

Basandosi sulla risposta di Frédéric usando solo javascript:

var url = document.URL

window.alert(url.substr(url.lastIndexOf('/') + 1));

3

Anche,

var url = $(this).attr("href");
var part = url.substring(url.lastIndexOf('/') + 1);

3

Se non sei preoccupato di generare gli elementi extra usando la divisione, allora il filtro potrebbe gestire il problema che menzioni della barra finale (Supponendo che tu abbia il supporto del browser per il filtro).

url.split('/').filter(function (s) { return !!s }).pop()

3
// Store original location in loc like: http://test.com/one/ (ending slash)
var loc = location.href; 
// If the last char is a slash trim it, otherwise return the original loc
loc = loc.lastIndexOf('/') == (loc.length -1) ? loc.substr(0,loc.length-1) : loc.substr(0,loc.lastIndexOf('/'));
var targetValue = loc.substr(loc.lastIndexOf('/') + 1);

targetValue = one

Se il tuo URL è simile a:

http://test.com/one/

o

http://test.com/one

o

http://test.com/one/index.htm

Quindi loc finisce per apparire come: http://test.com/one

Ora, poiché si desidera l'ultimo elemento, eseguire il passaggio successivo per caricare il valore (targetValue) che si voleva originariamente.

var targetValue = loc.substr(loc.lastIndexOf('/') + 1);

Probabilmente mi manca qualcosa, ma con " test.com/one " loc sembra: " test.com ". Penso che dovrebbe essere come: if (loc.lastIndexOf ('/') == (loc.length -1)) {loc = loc.substr (0, loc.length-1)} else {var isFile = loc. substr (loc.lastIndexOf ('/'), loc.length) .indexOf ('.')! = -1; if (isFile) loc = loc.substr (0, loc.lastIndexOf ('/')); }
Allan Raquin,

Non riesce se si taglia searcho hash.
Walf

3
window.alert(this.pathname.substr(this.pathname.lastIndexOf('/') + 1));

Utilizzare la pathnameproprietà nativa perché è la più semplice ed è già stata analizzata e risolta dal browser. $(this).attr("href")può restituire valori come quelli ../..che non ti darebbero il risultato corretto.

Se è necessario mantenere il searche hash(ad es. foo?bar#bazDa http://quux.com/path/to/foo?bar#baz) utilizzare questo:

window.alert(this.pathname.substr(this.pathname.lastIndexOf('/') + 1) + this.search + this.hash);

Voglio anche aggiungere che pathnamespoglia i parametri della query, ma hrefnon lo fa.
Max Heiber,

3

Per ottenere l'ultimo segmento della finestra corrente:

window.location.href.substr(window.location.href.lastIndexOf('/') +1)


3

puoi prima rimuovere se c'è / alla fine e quindi ottenere l'ultima parte dell'URL

let locationLastPart = window.location.pathname
if (locationLastPart.substring(locationLastPart.length-1) == "/") {
  locationLastPart = locationLastPart.substring(0, locationLastPart.length-1);
}
locationLastPart = locationLastPart.substr(locationLastPart.lastIndexOf('/') + 1);

3

Restituisce l'ultimo segmento, indipendentemente dalle barre finali:

var val = 'http://mywebsite/folder/file//'.split('/').filter(Boolean).pop();

console.log(val);


Probabilmente non vuoi usare path.sepuna barra letterale. Vedi nodejs.org/api/path.html#path_path_sep . Ciò manterrà il tuo codice portatile su tutti i sistemi operativi.
Aaron il

1
Bella idea, ma non funzionerebbe più nel browser
John Doherty il

buon punto. Dovrei dire che questo è preferito negli script da riga di comando / nodejs sul lato server.
Aaron,


1

Risposta raddevus aggiornata:

var loc = window.location.href;
loc = loc.lastIndexOf('/') == loc.length - 1 ? loc.substr(0, loc.length - 1) : loc.substr(0, loc.length + 1);
var targetValue = loc.substr(loc.lastIndexOf('/') + 1);

Stampa l'ultimo percorso dell'URL come stringa:

test.com/path-name = path-name

test.com/path-name/ = path-name

0

Credo che sia più sicuro rimuovere la barra ('/') prima di eseguire la sottostringa. Perché ho una stringa vuota nel mio scenario.

window.alert((window.location.pathname).replace(/\/$/, "").substr((window.location.pathname.replace(/\/$/, "")).lastIndexOf('/') + 1));


0

Non so davvero se regex è il modo giusto per risolvere questo problema in quanto può davvero influire sull'efficienza del tuo codice, ma il regex di seguito ti aiuterà a recuperare l'ultimo segmento e ti fornirà comunque l'ultimo segmento anche se l'URL è seguito da un vuoto /. La regex che mi è venuta in mente è:

[^\/]+[\/]?$

0
// https://x.com/boo/?q=foo&s=bar = boo
// https://x.com/boo?q=foo&s=bar = boo
// https://x.com/boo/ = boo
// https://x.com/boo = boo

const segment = new 
URL(window.location.href).pathname.split('/').filter(Boolean).pop();
console.log(segment);

Per me va bene.


0

So che è vecchio ma se vuoi ottenere questo da un URL potresti semplicemente usare:

document.location.pathname.substring(document.location.pathname.lastIndexOf('/.') + 1);

document.location.pathnameottiene il percorso dall'URL corrente. lastIndexOfottenere l'indice dell'ultima occorrenza del seguente Regex, nel nostro caso è /.. Il punto indica qualsiasi carattere, quindi non verrà conteggiato se /l'ultimo è nell'URL. substringtaglierà la stringa tra due indici.


0

se l'URL è http://localhost/madukaonline/shop.php?shop=79

console.log(location.search); porterà ?shop=79

quindi il modo più semplice è usare location.search

puoi cercare maggiori informazioni qui e qui


0

Puoi farlo con semplici percorsi (w / 0) stringhe di stringa ecc.

Concesso probabilmente eccessivamente complesso e probabilmente non performante, ma volevo usarlo reduceper divertirmi.

  "/foo/bar/"
    .split(path.sep)
    .filter(x => x !== "")
    .reduce((_, part, i, arr) => {
      if (i == arr.length - 1) return part;
    }, "");
  1. Dividi la stringa sui separatori di percorso.
  2. Filtra le parti vuote del percorso della stringa (ciò potrebbe accadere con una barra finale nel percorso).
  3. Ridurre l'array delle parti del percorso all'ultima.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.