Đoạn cuối của URL


228

Làm cách nào để có được đoạn cuối của url? Tôi có đoạn mã sau hiển thị url đầy đủ của thẻ neo được nhấp:

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

Nếu url là

http://mywebsite/folder/file

Làm cách nào để tôi chỉ hiển thị phần "tệp" của url trong hộp cảnh báo?


Dưới đây là giải pháp kịch bản java làm việc của tôi. Hy vọng nó giúp. stackoverflow.com/a/38370175/610951
Ravi Shankar Kota

Câu trả lời:


369

Bạn cũng có thể sử dụng hàm lastIndexOf () để xác định vị trí xuất hiện cuối cùng của /ký tự trong URL của mình, sau đó là hàm chuỗi con () để trả về chuỗi con bắt đầu từ vị trí đó:

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

Bằng cách đó, bạn sẽ tránh tạo một mảng chứa tất cả các phân đoạn URL của mình split().


3
@oshirowanen, không, nhưng nó sẽ tạo ra một thành phần mảng từ mỗi phân đoạn URL. Vì bạn chỉ quan tâm đến phân khúc cuối cùng, nên có thể lãng phí khi phân bổ nhiều yếu tố mảng mà bạn sẽ không bao giờ sử dụng.
Frédéric Hamidi

11
Nhưng nếu url đã trở nên như admin/store/tour/-1/vậy thì nó sẽ là ''chuỗi?
Đặt Kyar Wa Lar

1
@ Set, đẹp hơn có lẽ, chậm hơn chắc chắn.
Frédéric Hamidi

1
Điều gì nếu url chứa một /ở cuối?
Sнаđошƒаӽ

6
Người nhận: @ Set Kyar Wa Lar Aug và @ Sнаđошƒаӽ Giải pháp cho url có chứa một /đoạn cuối: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);


Bạn có thể giải thích cho tôi làm thế nào nó hoạt động? theo kiến ​​thức của tôi .pop () được sử dụng để loại bỏ phần tử cuối cùng của một mảng. nhưng ở đây nó đã hiển thị phần tử cuối cùng của url của tôi !!
Truyền cảm hứng cho Shahin

1
Split sẽ chuyển đổi url của bạn thành một mảng lấy từng phần của url được phân tách bằng '/'. Do đó, phân đoạn cuối cùng là phần tử cuối cùng của cả url và mảng được tạo sau đó.
stephen

10
Điều này sẽ không hoạt động nếu url kết thúc bằng "/" tức làhttp://mywebsite/folder/file/
Peter Ludlow

@PeterLudlow nó hoạt động trong Chrome 76, bạn có thể giải thích rõ hơn
zyrup

1
@PeterLudlow nó hoạt động vì một chuỗi rỗng là sai trong tóm tắt JS "" == falsetrong trường hợp đó nó bật một phần của mảng với chuỗi rỗng
zyrup

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

2
đơn giản và dễ dàng. Cảm ơn.
krezaeim

3
Hoàn hảo và gọn gàng, tuyệt vời
Babak Habibi

1
Phản ứng đẹp và sạch sẽ
Zarkys Salas 30/07/19

1
Điều này thật đúng với gì mà tôi đã tìm kiếm. Sử dụng Reac-router-dom, đây là giải pháp sạch nhất mà tôi đã tìm thấy để tìm phần cuối của URL theo dấu gạch chéo về phía trước /. console.log(history.location.pathname.split("/").pop()) Nếu có một cách tốt hơn tôi muốn biết! Hy vọng bình luận này có thể dẫn nhiều người đến câu trả lời của bạn. Cảm ơn @ Dblock247
Tralawar

Sidenote: Điều này không hoạt động nếu URL có các tham số truy vấn được đặt trên nó (ví dụ .../file?var=value&foo=bar). Giải pháp này giải quyết vấn đề này theo cách mạnh mẽ và hiện đại hơn: stackoverflow.com/a/51795122/1123743
Sebastian Barth

30

Chỉ là một giải pháp khác với regex.

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

Tôi thích nó Cảm ơn :).
Salil Sharma

18

Javascript có chức năng phân chia liên quan đến đối tượng chuỗi có thể giúp bạn:

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

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

17

Các câu trả lời khác có thể hoạt động nếu đường dẫn đơn giản, chỉ bao gồm các yếu tố đường dẫn đơn giản. Nhưng khi nó chứa tham số truy vấn là tốt, họ phá vỡ.

Thay vào đó, sử dụng tốt hơn đối tượng URL để có được một giải pháp mạnh mẽ hơn. Đó là một cách giải thích được phân tích cú pháp của URL hiện tại:

Đầu vào: 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);

Đầu ra: 'boo'

Điều này hoạt động cho tất cả các trình duyệt phổ biến. Chỉ IE chết của chúng tôi không hỗ trợ điều đó (và sẽ không). Đối với IE, có sẵn một polyfill (nếu bạn quan tâm ).



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

5

Tôi biết, đã quá muộn, nhưng đối với những người khác: Tôi rất khuyến khích sử dụng plugin PURL jquery . Động lực cho PURL là url có thể được phân đoạn theo '#' (ví dụ: liên kết angular.js), tức là url có thể trông giống như

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

hoặc là

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

Và với PURL, bạn có thể dễ dàng quyết định (phân đoạn / phân tích) phân khúc nào bạn muốn nhận.

Đối với phân đoạn cuối cùng "cổ điển", bạn có thể viết:

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

4

Dựa trên câu trả lời của Frédéric chỉ bằng javascript:

var url = document.URL

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

3

Cũng thế,

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

3

Nếu bạn không lo lắng về việc tạo các phần tử bổ sung bằng cách sử dụng phần tách thì bộ lọc có thể xử lý sự cố bạn đề cập đến dấu gạch chéo (Giả sử bạn có hỗ trợ trình duyệt cho bộ lọc).

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 = một

Nếu url của bạn trông như:

http://test.com/one/

hoặc là

http://test.com/one

hoặc là

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

Sau đó, loc cuối cùng trông giống như: http://test.com/one

Bây giờ, vì bạn muốn mục cuối cùng, hãy chạy bước tiếp theo để tải giá trị (targetValue) ban đầu bạn muốn.

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

Tôi có thể bỏ lỡ một cái gì đó, nhưng với " test.com/one " loc cuối cùng trông giống như: " test.com ". Tôi nghĩ nó phải giống như: if (loc.lastIndexOf ('/') == (loc.length -1)) {loc = loc.substr (0, loc.length-1)} other {var isFile = loc. chất nền (loc.lastIndexOf ('/'), loc.length) .indexOf ('.')! = -1; if (isFile) loc = loc.substr (0, loc.lastIndexOf ('/')); }
Allan Raquin

Thất bại nếu gạch chéo trong searchhoặc hash.
Walf

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

Sử dụng thuộc tính gốc pathnamevì nó đơn giản nhất và đã được trình duyệt phân tích và giải quyết. $(this).attr("href")có thể trả về các giá trị như thế ../..sẽ không cung cấp cho bạn kết quả chính xác.

Nếu bạn cần giữ searchhash(ví dụ foo?bar#baztừ http://quux.com/path/to/foo?bar#baz), hãy sử dụng:

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

Cũng muốn thêm pathnamecác tham số truy vấn dải đó , nhưng hrefkhông.
Max Heiber

3

Để có được phân đoạn cuối cùng của cửa sổ hiện tại của bạn:

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


3

trước tiên bạn có thể xóa nếu có / ở cuối và sau đó lấy phần cuối của 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

Trả về đoạn cuối cùng, bất kể dấu gạch chéo:

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

console.log(val);


Bạn có thể muốn sử dụng path.sepkhông phải là một dấu gạch chéo theo nghĩa đen. Xem nodejs.org/api/path.html#path_path_sep . Điều này sẽ giữ cho mã của bạn di động trên các hệ điều hành.
Aaron

1
Ý tưởng hay, nhưng nó sẽ không còn hoạt động trong trình duyệt
John Doherty

điểm tốt. Tôi nên nói rằng điều này được ưa thích trong các tập lệnh dòng lệnh / nodejs phía máy chủ.
Aaron


1

Cập nhật câu trả lời 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);

In đường dẫn cuối cùng của url dưới dạng chuỗi:

test.com/path-name = path-name

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

0

Tôi tin rằng sẽ an toàn hơn khi xóa dấu gạch chéo đuôi ('/') trước khi thực hiện chuỗi con. Bởi vì tôi có một chuỗi trống trong kịch bản của mình.

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

0

Tôi đang sử dụng regex và split:

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

Cuối cùng nó sẽ bỏ qua #? & / kết thúc các url, xảy ra rất nhiều. Thí dụ:

https://cardsrealm.com/profile/cardsRealm -> Trả về thẻRealm

https://cardsrealm.com/profile/cardsRealm#hello -> Trả về thẻRealm

https://cardsrealm.com/profile/cardsRealm?hello -> Trả lại thẻRealm

https://cardsrealm.com/profile/cardsRealm/ -> Trả về thẻRealm


0

Tôi thực sự không biết liệu regex có phải là cách đúng để giải quyết vấn đề này hay không vì nó thực sự có thể ảnh hưởng đến hiệu quả của mã của bạn, nhưng regex dưới đây sẽ giúp bạn tìm nạp phân đoạn cuối và nó sẽ vẫn cung cấp cho bạn phân đoạn cuối ngay cả khi URL tiếp theo là một sản phẩm nào /. Regex mà tôi nghĩ ra là:

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

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

Làm việc cho tôi.


0

Tôi biết nó đã cũ nhưng nếu bạn muốn lấy cái này từ một URL, bạn có thể chỉ cần sử dụng:

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

document.location.pathnamelấy tên đường dẫn từ URL hiện tại. lastIndexOflấy chỉ số của lần xuất hiện cuối cùng của Regex sau, trong trường hợp của chúng tôi là /.. Dấu chấm có nghĩa là bất kỳ ký tự nào, do đó, nó sẽ không được tính nếu /là ký tự cuối cùng trên URL. substringsẽ cắt chuỗi giữa hai chỉ mục.


0

nếu url là http://localhost/madukaonline/shop.php?shop=79

console.log(location.search); sẽ mang ?shop=79

Vì vậy, cách đơn giản nhất là sử dụng location.search

bạn có thể tra cứu để biết thêm ở đâyđây


0

Bạn có thể làm điều này với các truy vấn đường dẫn đơn giản (w / 0), v.v.

Cấp có lẽ quá phức tạp và có thể không biểu diễn, nhưng tôi muốn sử dụng reducecho niềm vui của nó.

  "/foo/bar/"
    .split(path.sep)
    .filter(x => x !== "")
    .reduce((_, part, i, arr) => {
      if (i == arr.length - 1) return part;
    }, "");
  1. Tách chuỗi trên đường phân cách.
  2. Lọc ra các phần đường dẫn chuỗi rỗng (điều này có thể xảy ra với dấu gạch chéo trong đường dẫn).
  3. Giảm mảng các phần đường dẫn đến phần cuối cùng.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.