URL'nin son bölümü


228

Bir URL'nin son segmentini nasıl edinebilirim? Tıklanan çapa etiketinin tam url görüntüler aşağıdaki komut dosyası var:

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

URL

http://mywebsite/folder/file

uyarı kutusundaki URL'nin yalnızca "dosya" kısmını görüntülemesini nasıl sağlayabilirim?


Aşağıda benim çalışma java komut dosyası çözümü. Umarım yardımcı olur. stackoverflow.com/a/38370175/610951
Ravi Shankar Kota

Yanıtlar:


369

URL'nizdeki karakterin son tekrarını bulmak için lastIndexOf () işlevini /, ardından bu konumdan başlayarak alt dizeyi döndürmek için substring () işlevini de kullanabilirsiniz:

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

Bu şekilde, tüm URL segmentlerinizi içeren bir dizi oluşturmaktan kaçınacaksınız split().


3
@oshirowanen, hayır, ancak her URL segmentinden bir dizi öğesi oluşturur. Yalnızca son segmentle ilgilendiğiniz için, asla kullanmayacağınız birçok dizi öğesinin ayrılması israf olabilir.
Frédéric Hamidi

11
Ancak url admin/store/tour/-1/bu şekilde olsaydı, ''dize olur mu?
Kyar Wa Lar

1
@Set, güzel, belki daha yavaş.
Frédéric Hamidi

1
url /sonunda bir a içeriyorsa ne olur ?
Sнаđошƒаӽ

6
Attn: @Set Kyar Wa Lar Ağustos ve @ Sнаđошƒаӽ /Sonunda a içeren url için çözüm :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);


Bana nasıl çalıştığını açıklayabilir misin? bildiklerime göre .pop () dizinin son elemanını kaldırmak için kullanılır. ama burada benim url son unsuru gösterdi !!
Şahin'e

1
Split, URL'nizi '/' ile ayrılmış URL'nin her bir bölümünü alarak bir diziye dönüştürür. Dolayısıyla son segment, hem url'nin hem de daha sonra oluşturulan dizinin son öğesidir.
stephen

10
URL bir "/" ile biterse bu işe yaramazhttp://mywebsite/folder/file/
Peter Ludlow

@PeterLudlow Chrome 76'da çalışır, lütfen ayrıntılı bir şekilde inceleyebilirsiniz
zyrup

1
@PeterLudlow, JS soyutunda boş bir dize yanlış olduğu için çalışır "" == false, bu durumda dizinin bir kısmını boş dize ile
açar

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

2
basit ve kolay. Teşekkürler.
krezaeim

3
Mükemmel ve düzenli, harika
Babak Habibi

1
Güzel ve temiz tepki
Zarkys Salas

1
Tam da aradığım şey buydu. Tepki yönlendirici-dom kullanarak, URL'nin son eğik çizgiyi takip eden son bölümünü bulmak için bulduğum en temiz çözüm buydu /. console.log(history.location.pathname.split("/").pop()) Daha iyi bir yol varsa bilmek istiyorum! Umarım bu yorum cevabınıza daha fazla insanı yönlendirebilir. Teşekkürler @ Dblock247
Tralawar

1
@SebastianBarth bu sorgu dizesi parametresini aramıyor. .Pathname çağrısı, sorgu parametreleri olup olmadığına bakılmaksızın, url yolunun son segmentini elde etmektir.
Dblock247

30

Normal ifade ile başka bir çözüm.

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

Beğendim teşekkürler :).
Salil Sharma

18

Javascript, size yardımcı olabilecek dize nesnesiyle ilişkili işlev bölmesine sahiptir:

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

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

17

Diğer yanıtlar, yol basitse yalnızca basit yol öğelerinden oluşan işe yarayabilir. Ancak sorgu parametrelerini de içerdiğinde kırılırlar.

Daha iyi URL kullanın güçlü bir çözüm elde etmek için bunun yerine nesnesini . Mevcut URL'nin ayrıştırılmış bir yorumudur:

Giriş: 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);

Çıktı: 'boo'

Bu, tüm yaygın tarayıcılar için geçerlidir. Sadece ölmekte olan IE'imiz bunu desteklemiyor (ve desteklemiyor). IE için olsa da, bir çok dolgu mevcuttur (eğer hiç umursamıyorsanız ).



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

5

Biliyorum, çok geç, ama diğerleri için: PURL jquery eklentisini kullanmanızı şiddetle tavsiye ederim . PURL için motivasyon, url'nin de '#' ile bölümlendirilebileceğidir (örnek: angular.js bağlantıları), yani url,

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

veya

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

Ve PURL ile hangi segmenti almak istediğinize kolayca karar verebilirsiniz (segment / fsegment).

"Klasik" son segment için şunları yazabilirsiniz:

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

4

Sadece javascript kullanarak Frédéric'in cevabına dayanmak:

var url = document.URL

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

3

Ayrıca,

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

3

Bölmeyi kullanarak fazladan öğeler oluşturma konusunda endişelenmiyorsanız, filtre, eğik çizgiden (filtre için tarayıcı desteğine sahip olduğunuzu varsayarsak) bahsettiğiniz sorunu çözebilir.

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 = bir

URL'niz aşağıdaki gibi görünüyorsa:

http://test.com/one/

veya

http://test.com/one

veya

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

Sonra loc şöyle görünür: http://test.com/one

Şimdi, son öğeyi istediğiniz için, başlangıçta istediğiniz değeri (targetValue) yüklemek için bir sonraki adımı çalıştırın.

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

Ama "ile muhtemelen özledim şey test.com/one ": benzedi "loc uçları test.com ". Sanırım şöyle olmalı: 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

Eğik çizgi searchveya olursa başarısız olur hash.
Walf

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

pathnameEn basit olduğu ve tarayıcı tarafından zaten ayrıştırıldığı ve çözüldüğü için yerel özelliği kullanın . $(this).attr("href")gibi değerler döndürebilir../..size doğru sonucu vermeyecek .

Saklamak gerekiyorsa searchve hash(örn foo?bar#bazitibaren http://quux.com/path/to/foo?bar#baz) bunu kullanın:

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

Ayrıca pathnameşerit parametreleri sorgu parametreleri eklemek istiyorum , ama hrefdeğil.
Max Heiber

3

Geçerli pencerenizin son segmentini almak için:

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


3

önce / sonunda varsa kaldırabilir ve sonra url'nin son kısmını alabilirsiniz

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

Sondaki eğik çizgilere bakılmaksızın son segmenti döndürür:

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

console.log(val);


Muhtemelen path.sepgerçek bir eğik çizgi kullanmak istemezsiniz . Bkz. Nodejs.org/api/path.html#path_path_sep . Bu, kodunuzu işletim sistemlerinde taşınabilir tutacaktır.
Aaron

1
Güzel fikir, ama artık tarayıcıda işe yaramaz
John Doherty

iyi bir nokta. Bu komut satırı komut dosyaları / sunucu tarafı nodejs tercih olduğunu söylemeliyim.
Aaron


1

Güncellenmiş raddevus yanıtı:

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

URL'nin son yolunu dize olarak yazdırır:

test.com/path-name = path-name

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

0

Alt dize yapmadan önce kuyruk eğik çizgisini ('/') çıkarmanın daha güvenli olduğuna inanıyorum. Çünkü senaryomda boş bir dize var.

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


0

Normal ifadenin kodunuzun verimliliğini gerçekten etkileyebileceğinden, bu sorunu çözmenin doğru yolu olup olmadığını gerçekten bilmiyorum, ancak aşağıdaki normal ifade son segmenti getirmenize yardımcı olacak ve URL olsa bile size son segmenti verecek arkasından bir boş gelir /. Ben geldi regex:

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

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

Benim için çalışıyor.


0

Eski olduğunu biliyorum ama bunu bir URL'den almak istiyorsanız sadece kullanabilirsiniz:

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

document.location.pathnameyol adını geçerli URL'den alır. lastIndexOfbizim durumumuzda, aşağıdaki Regex son oluşum indeksi olsun /.. Nokta herhangi bir karakter anlamına gelir, bu nedenle /URL'deki son karakter ise sayılmaz . substringdizeyi iki dizin arasında keser.


0

url ise http://localhost/madukaonline/shop.php?shop=79

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

bu yüzden en basit yol location.search kullanmaktır

burada ve burada daha fazla bilgi arayabilirsiniz


0

Bunu basit yollar (w / 0) sorgu dizeleri vb. İle yapabilirsiniz.

Muhtemelen aşırı karmaşık ve muhtemelen performans vermedi, ama reduceeğlenmek için kullanmak istedim .

  "/foo/bar/"
    .split(path.sep)
    .filter(x => x !== "")
    .reduce((_, part, i, arr) => {
      if (i == arr.length - 1) return part;
    }, "");
  1. Dizeyi yol ayırıcılara ayırın.
  2. Boş dize yolu parçalarını filtreleyin (bu, yoldaki sondaki eğik çizgi ile olabilir).
  3. Yol parçaları dizisini sonuncusuna indirin.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.