ส่วนสุดท้ายของ URL


228

ฉันจะรับส่วนสุดท้ายของ URL ได้อย่างไร ฉันมีสคริปต์ต่อไปนี้ซึ่งแสดง URL แบบเต็มของแท็กสมอที่คลิก:

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

ถ้า URL เป็น

http://mywebsite/folder/file

ฉันจะให้มันแสดงเฉพาะส่วน "ไฟล์" ของ URL ในช่องแจ้งเตือนได้อย่างไร


ด้านล่างเป็นโซลูชันจาวาสคริปต์ของฉันที่ทำงานอยู่หวังว่าจะช่วยได้ stackoverflow.com/a/38370175/610951
Ravi Shankar Kota

คำตอบ:


369

คุณยังสามารถใช้ฟังก์ชั่นlastIndexOf ()เพื่อค้นหาการเกิดขึ้นครั้งสุดท้ายของ/ตัวละครใน URL ของคุณจากนั้นฟังก์ชั่นซับสตริง ()เพื่อส่งคืนซับสตริงที่เริ่มต้นจากตำแหน่งนั้น:

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

วิธีการที่คุณจะหลีกเลี่ยงการสร้างอาร์เรย์ที่มีส่วน URL ทั้งหมดของคุณเป็นsplit()ไม่


3
@oshirowanen ไม่ แต่มันจะสร้างองค์ประกอบอาร์เรย์จากแต่ละส่วน URL เนื่องจากคุณสนใจเฉพาะกลุ่มที่ผ่านมาจึงอาจเป็นเรื่องสิ้นเปลืองในการจัดสรรองค์ประกอบหลายอย่างที่คุณไม่เคยใช้
Frédéric Hamidi

11
แต่ถ้า URL เป็นเช่นadmin/store/tour/-1/นั้นมันจะเป็น''สตริงหรือไม่
ตั้ง Kyar Wa Lar

1
@ เซ็ต, nicer อาจจะช้ากว่าแน่นอน
Frédéric Hamidi

1
เกิดอะไรขึ้นถ้า URL มี a /ตอนท้าย?
Sнаđошƒаӽ

6
เรียน @Set Kyar Wa Lar Aug และ @ Sнаđошƒаӽโซลูชั่นสำหรับ url ที่มี a /ท้าย: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);


คุณอธิบายฉันได้ไหมว่ามันทำงานอย่างไร ตามความรู้ของฉัน. pop () ใช้สำหรับลบองค์ประกอบสุดท้ายของอาร์เรย์ แต่ที่นี่มันแสดงให้เห็นองค์ประกอบสุดท้ายของ URL ของฉัน !!
ดลใจ Shahin

1
แยกจะแปลง URL ของคุณเป็นอาร์เรย์โดยแต่ละส่วนของ URL คั่นด้วย '/' ดังนั้นส่วนสุดท้ายคือองค์ประกอบสุดท้ายของทั้ง url และอาร์เรย์ที่สร้างขึ้นในภายหลัง
stephen

10
สิ่งนี้จะไม่ทำงานหาก URL ลงท้ายด้วย "/" เช่นhttp://mywebsite/folder/file/
Peter Ludlow

@PeterLudlow ใช้งานได้ใน Chrome 76 คุณสามารถอธิบายเพิ่มเติมได้
ไหม

1
@PeterLudlow ใช้งานได้เนื่องจากสตริงว่างเป็นเท็จใน JS abstract "" == falseในกรณีนั้นมันจะปรากฏส่วนของอาร์เรย์ด้วยสตริงว่าง
zyrup

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

2
ง่ายและสะดวก ขอบคุณ
krezaeim

3
สมบูรณ์แบบและเป็นระเบียบเรียบร้อยยอดเยี่ยม
Babak Habibi

1
การตอบสนองที่สวยงามและสะอาด
Zarkys Salas

1
นี่คือสิ่งที่ฉันกำลังมองหา ใช้ตอบสนองเตอร์-Dom นี้เป็นวิธีการแก้ปัญหาที่สะอาดที่ฉันได้พบเพื่อหาสิ่งที่ส่วนสุดท้ายของ URL /ท้ายทับสุดท้าย console.log(history.location.pathname.split("/").pop()) หากมีวิธีที่ดีกว่าที่ฉันอยากจะรู้! หวังว่าความคิดเห็นนี้จะนำผู้คนไปสู่คำตอบของคุณมากขึ้น ขอบคุณ @ Dblock247
Tralawar

Sidenote: วิธีนี้ใช้ไม่ได้หาก URL มีชุดพารามิเตอร์การสืบค้นอยู่ (เช่น.../file?var=value&foo=bar) วิธีนี้แก้ปัญหานี้ได้อย่างแข็งแกร่งและทันสมัยยิ่งขึ้น: stackoverflow.com/a/51795122/1123743
Sebastian Barth

30

เป็นอีกหนึ่งโซลูชั่นที่มี regex

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

ฉันชอบมันขอบคุณ :)
Salil Sharma

18

Javascript มีฟังก์ชั่นแบ่งที่เกี่ยวข้องกับวัตถุสตริงที่สามารถช่วยคุณ:

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

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

17

คำตอบอื่น ๆ อาจใช้งานได้หากเส้นทางนั้นเรียบง่ายประกอบด้วยองค์ประกอบของเส้นทางแบบง่ายเท่านั้น แต่เมื่อมันมี params ของแบบสอบถามเช่นกันมันจะแตก

ควรใช้ออบเจ็กต์URLแทนเพื่อรับโซลูชันที่มีประสิทธิภาพยิ่งขึ้น เป็นการตีความคำที่แยกวิเคราะห์ของ URL ปัจจุบัน:

การป้อนข้อมูล: 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);

เอาท์พุท: 'boo'

สิ่งนี้ใช้ได้กับเบราว์เซอร์ทั่วไปทั้งหมด มีเพียง IE ที่กำลังจะตายของเราเท่านั้นที่ไม่สนับสนุน (และจะไม่) สำหรับ IE มีpolyfillsใช้ได้แม้ว่า (ถ้าคุณสนใจที่ทั้งหมด)




5

ฉันรู้ว่ามันจะสายเกินไป แต่สำหรับคนอื่นผมขอแนะนำให้ใช้PURL jQuery Plugin แรงจูงใจสำหรับ PURL คือ url สามารถแบ่งได้ด้วย'#'เช่นกัน (ตัวอย่าง: ลิงค์ angular.js) เช่น url อาจดูเหมือน

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

หรือ

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

และด้วย PURL คุณสามารถตัดสินใจได้อย่างง่ายดาย (เซกเมนต์ / fsegment) ซึ่งเป็นเซ็กเมนต์ที่คุณต้องการรับ

สำหรับเซ็กเมนต์สุดท้าย "คลาสสิค" คุณสามารถเขียน:

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

4

สร้างคำตอบของFrédéricโดยใช้ javascript เท่านั้น:

var url = document.URL

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


3

หากคุณไม่กังวลเกี่ยวกับการสร้างองค์ประกอบเพิ่มเติมโดยใช้ตัวแยกตัวกรองสามารถจัดการกับปัญหาที่คุณพูดถึงเครื่องหมายสแลช (สมมติว่าคุณมีเบราว์เซอร์ที่รองรับตัวกรอง)

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 = หนึ่ง

หาก URL ของคุณดูเหมือนว่า:

http://test.com/one/

หรือ

http://test.com/one

หรือ

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

จากนั้น loc จะปรากฏขึ้นเช่น: http://test.com/one

ตอนนี้เนื่องจากคุณต้องการไอเท็มสุดท้ายให้รันขั้นตอนถัดไปเพื่อโหลดค่า (targetValue) ที่คุณต้องการในตอนแรก

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

ฉันอาจจะพลาดบางสิ่ง แต่ด้วย " test.com/one " loc ดูเหมือนว่า: " test.com " ฉันคิดว่ามันควรจะเป็นเช่น: ถ้า (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

ล้มเหลวถ้าเฉือนในหรือsearch hash
Walf

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

ใช้pathnameคุณสมบัติเนทิฟเนื่องจากเบราว์เซอร์นั้นง่ายที่สุดและได้รับการวิเคราะห์และแก้ไขโดยเบราว์เซอร์แล้ว $(this).attr("href")สามารถคืนค่าเช่น../..ที่จะไม่ให้ผลลัพธ์ที่ถูกต้อง

หากคุณต้องการเก็บsearchและhash(เช่นfoo?bar#bazจากhttp://quux.com/path/to/foo?bar#baz) ใช้สิ่งนี้:

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

ยังต้องการเพิ่มpathnameพารามิเตอร์แถบแบบสอบถามที่ แต่hrefไม่
Max Heiber

3

ในการรับส่วนสุดท้ายของหน้าต่างปัจจุบันของคุณ:

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


3

คุณสามารถลบออกได้หากมี / ในตอนท้ายจากนั้นรับส่วนสุดท้ายของ 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

ส่งคืนเซ็กเมนต์สุดท้ายโดยไม่คำนึงถึงเครื่องหมายสแลชต่อท้าย:

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

console.log(val);


คุณอาจต้องการใช้path.sepไม่ใช่เครื่องหมายสแลช ดูnodejs.org/api/path.html#path_path_sep สิ่งนี้จะทำให้โค้ดของคุณพกพาไปได้ในทุก OS
แอรอน

1
เป็นความคิดที่ดี แต่จะไม่ทำงานในเบราว์เซอร์อีกต่อไป
John Doherty

จุดดี. ฉันควรจะบอกว่านี่เป็นที่ต้องการในสคริปต์บรรทัดคำสั่ง / nodejs ฝั่งเซิร์ฟเวอร์
แอรอน


1

อัปเดตคำตอบ raddevus:

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 เป็นสตริง:

test.com/path-name = path-name

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

0

ฉันเชื่อว่าการลบ tail slash ('/') ปลอดภัยกว่าก่อนที่จะทำการซับสตริง เพราะฉันมีสตริงว่างในสถานการณ์ของฉัน

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

0

ฉันใช้ regex และแยก:

var last_path = location.href.match (/. / (. [\ w]) /) [1] .split ("#") [0] .split ("?") [0]

ในท้ายที่สุดมันจะละเว้น #? & / สิ้นสุด URL ซึ่งเกิดขึ้นมาก ตัวอย่าง:

https://cardsrealm.com/profile/cardsRealm -> ส่งคืน cardsRealm

https://cardsrealm.com/profile/cardsRealm#hello -> ส่งคืน cardsRealm

https://cardsrealm.com/profile/cardsRealm?hello -> ส่งคืน cardsRealm

https://cardsrealm.com/profile/cardsRealm/ -> ส่งคืน cardsRealm


0

ฉันไม่รู้จริงๆว่า regex เป็นวิธีที่ถูกต้องในการแก้ปัญหานี้หรือไม่เพราะมันอาจส่งผลกระทบต่อประสิทธิภาพของรหัสของคุณได้จริง แต่ regex ด้านล่างจะช่วยให้คุณดึงส่วนสุดท้ายได้และจะยังคงให้เซ็กเมนต์สุดท้ายแม้ว่า URL /ตามด้วยที่ว่างเปล่า 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);

ได้ผลสำหรับฉัน


0

ฉันรู้ว่ามันเก่า แต่ถ้าคุณต้องการได้รับจาก URL คุณสามารถใช้:

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

document.location.pathnameรับชื่อพา ธ จาก URL ปัจจุบัน lastIndexOfได้รับดัชนีเกิดขึ้นครั้งล่าสุดของ Regex /.ต่อไปนี้ในกรณีของเราคือ จุดหมายถึงตัวละครใด ๆ ดังนั้นมันจะไม่นับถ้า/เป็นตัวอักษรตัวสุดท้ายของ URL substringจะตัดสตริงระหว่างสองดัชนี


0

ถ้า URL เป็น http://localhost/madukaonline/shop.php?shop=79

console.log(location.search); จะนำ ?shop=79

ดังนั้นวิธีที่ง่ายที่สุดคือการใช้location.search

คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ที่นี่ และที่นี่


0

คุณสามารถทำเช่นนี้กับเส้นทางที่เรียบง่าย (w / 0) การสอบถาม ฯลฯ

ได้รับอาจซับซ้อนเกินไปและอาจไม่ใช่นักแสดง แต่ฉันต้องการใช้reduceเพื่อความสนุกของมัน

  "/foo/bar/"
    .split(path.sep)
    .filter(x => x !== "")
    .reduce((_, part, i, arr) => {
      if (i == arr.length - 1) return part;
    }, "");
  1. แยกสตริงบนตัวคั่นพา ธ
  2. กรองส่วนของเส้นทางสตริงที่ว่างเปล่า (ซึ่งอาจเกิดขึ้นกับเครื่องหมายสแลชต่อท้ายในเส้นทาง)
  3. ลดอาเรย์ของส่วนพา ธ เป็นชิ้นสุดท้าย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.