Останній сегмент URL-адреси


228

Як отримати останній сегмент URL-адреси? У мене є такий скрипт, який відображає натиснуту повну URL-адресу тега якоря:

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

Якщо URL-адреса є

http://mywebsite/folder/file

як я можу його відображати лише частину URL-адреси "файл" у вікні попередження?


Нижче моє робоче сценарій Java-сценарію. Сподіваюся, що це допомагає. stackoverflow.com/a/38370175/610951
Раві Шанкар Кота

Відповіді:


369

Ви також можете використовувати функцію lastIndexOf () для пошуку останнього появи /символу у вашій URL-адресі, а потім функцію substring () для повернення підрядки, починаючи з цього місця:

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

Таким чином, ви уникнете створення масиву, що містить усі ваші сегменти URL, як split()це робиться.


3
@oshirowanen, ні, але це створить елемент масиву з кожного сегменту URL-адреси. Оскільки вас цікавить лише останній сегмент, може бути марно виділяти багато елементів масиву, які ви ніколи не будете використовувати.
Фредерік Хаміді

11
Але якщо URL-адреса стала подібною, admin/store/tour/-1/то вона буде ''рядковою?
Встановити Kyar Wa Lar

1
@ Встановити, приємніше, можливо, повільніше.
Фредерік Хаміді

1
що робити, якщо URL містить в /кінці?
Snađошƒаӽ

6
Attn: @Set Kyar Wa Lar Aug та @ Snađошƒаӽ Рішення для URL-адреси, що містить в /кінці:var url = window.location.href.replace(/\/$/, ''); /* remove optional end / */ var lastSeg = url.substr(url.lastIndexOf('/') + 1);
Росс

151

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

console.log(lastSegment);


Чи можете ви пояснити мені, як це працює? за моїми знаннями .pop (), що використовується для видалення останнього елемента масиву. але ось він показав останній елемент мого URL !!
Надихайте Шахіна

1
Спліт перетворить ваш URL у масив, беручи кожен розділ URL-адреси, обмежений знаком "/". Отже, останній сегмент є останнім елементом як URL-адреси, так і створеного згодом масиву.
Стефан

10
Це не спрацює, якщо URL закінчується знаком "/", тобтоhttp://mywebsite/folder/file/
Пітер Людлоу,

@PeterLudlow працює в Chrome 76, чи можете ви детальніше розробити
zyrup

1
@PeterLudlow працює, тому що порожня рядок є хибним у конспекті JS, "" == falseу цьому випадку вона вискакує частину масиву з порожньою рядком
zyrup

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

2
просто і легко. Дякую.
krezaeim

3
Ідеальний та охайний, чудовий
Бабак Хабібі

1
Гарна та чиста відповідь
Заркіс Салас

1
Це саме те, що я шукав. Використовуючи reakct-router-dom, це було найчистішим рішенням, яке я знайшов, щоб знайти останню частину URL-адреси, що спирається на останню косу рису вперед /. console.log(history.location.pathname.split("/").pop()) Якщо є кращий спосіб, я хотів би знати! Сподіваємось, цей коментар може привести більше людей до вашої відповіді. Дякую @ Dblock247
Тралавар

Sidenote: Це не працює, якщо в URL-адресі встановлені параметри запитів (наприклад .../file?var=value&foo=bar). Це рішення вирішує цю проблему більш надійним та сучасним способом: stackoverflow.com/a/51795122/1123743
Себастьян Барт


18

У Javascript є функція розбиття, пов'язана з об'єктом рядка, який може вам допомогти:

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

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

17

Інші відповіді можуть працювати, якщо шлях простий, що складається лише з простих елементів шляху. Але коли він також містить параметри запитів, вони порушуються.

Краще використовувати для цього об’єкт 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 є поліфіли , хоча (якщо ви взагалі переймаєтесь ).



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

5

Я знаю, вже пізно, але для інших: я дуже рекомендую використовувати плагін jurery PURL . Мотивація 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

Спираючись на відповідь Фредерика, використовуючи лише JavaScript:

var url = document.URL

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

3

Також,

var url = $(this).attr("href");
var part = url.substring(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

Потім локальний стан виглядає так: http://test.com/one

Тепер, оскільки вам потрібен останній елемент, запустіть наступний крок, щоб завантажити значення (targetValue), яке ви спочатку хотіли.

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

Я, мабуть, щось пропускаю, але з " test.com/one " локальним виглядає так: " 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; якщо (isFile) loc = loc.substr (0, loc.lastIndexOf ('/')); }
Аллан Ракін

Помилка, якщо коса риса в 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це не так.
Макс Хайбер

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 . Це дозволить зберегти ваш код переносним через ОС.
Аарон

1
Хороша ідея, але вона більше не працюватиме у браузері
Джон Дохерті

гарна думка. Слід сказати, що це є кращим у скриптах командного рядка / 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

Я вважаю, що перед тим, як робити підрядку, безпечніше зняти хвіст ("/"). Тому що я отримав порожній рядок у своєму сценарії.

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

0

Я використовую регулярний вираз і спліт:

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

Зрештою вона ігнорує #? & / закінчення URL-адрес, що трапляється багато. Приклад:

https://cardsrealm.com/profile/cardsRealm -> Повернення картRealm

https://cardsrealm.com/profile/cardsRealm#hello -> Повернення картRealm

https://cardsrealm.com/profile/cardsRealm?hello -> Повернення картRealm

https://cardsrealm.com/profile/cardsRealm/ -> Повернення картRealm


0

Я не знаю, чи регулярний виразник - це правильний спосіб вирішити цю проблему, оскільки це дійсно може вплинути на ефективність вашого коду, але наведений нижче регекс допоможе вам отримати останній сегмент, і він все одно надасть вам останній сегмент, навіть якщо URL-адреса супроводжується порожнім /. Регекс, який я придумав:

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

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. Зменшіть масив частин шляху до останньої.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.