Последний сегмент URL

228

Как мне получить последний сегмент URL? У меня есть следующий скрипт, который отображает полный URL тега привязки нажал:

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

Если URL-адрес

http://mywebsite/folder/file

Как я могу получить только для отображения «файл» часть URL-адреса в окне предупреждения?

oshirowanen
источник
Ниже мое рабочее решение сценария 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/он будет ''строки?
Установите Кьяр Ва Лар
1
@ Установить, может быть, лучше, медленнее, конечно.
Фредерик Хамиди
1
Что делать, если URL-адрес содержит /в конце?
Снаđошƒаӽ
6
Внимание: @Set Kyar Wa Lar Aug и @ Snađошƒаӽ Решение для URL, которое содержит /в конце: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!
Вдохновите Шахина
1
Split преобразует ваш URL-адрес в массив, содержащий каждый раздел URL-адреса, разделенный символом «/». Следовательно, последний сегмент является последним элементом как URL, так и впоследствии созданного массива.
Стивен
10
Это не сработает, если URL-адрес оканчивается на «/», то естьhttp://mywebsite/folder/file/
Питер Ладлоу
@PeterLudlow, это работает в Chrome 76, не могли бы вы уточнить
zyrup
1
@PeterLudlow это работает, потому что пустая строка является ложной в JS abstract, "" == falseв этом случае она выталкивает часть массива с пустой строкой
zyrup
87
window.location.pathname.split("/").pop()
Dblock247
источник
2
просто и легко. Спасибо.
krezaeim
3
Отлично и аккуратно, здорово
Бабак Хабиби
1
Красивый и чистый ответ
Заркыс Салас
1
Это именно то, что я искал. С помощью response-router-dom это было самое чистое решение, которое я нашел, чтобы найти последнюю часть URL-адреса после последней косой черты /. console.log(history.location.pathname.split("/").pop()) Если есть лучший способ, я хотел бы знать! Надеюсь, этот комментарий может привести больше людей к вашему ответу. Благодаря @ Dblock247
Tralawar
1
@SebastianBarth это не ищет параметр строки запроса. Вызов .pathname удаляет их, поскольку основное внимание уделяется получению последнего сегмента пути URL независимо от того, есть параметры запроса или нет.
Dblock247
30

Просто еще одно решение с регулярным выражением.

var href = location.href;
console.log(href.match(/([^\/]*)\/*$/)[1]);
Avirtum
источник
Мне нравится Спасибо :).
Салил Шарма
18

Javascript имеет функцию split, связанную со строковым объектом, которая может помочь вам:

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 есть полифиллы (если вам все равно ).

Себастьян Барт
источник
10

Или вы можете использовать регулярное выражение:

alert(href.replace(/.*\//, ''));
jasssonpet
источник
еще лучше, объедините это с stackoverflow.com/questions/4758103/… :alert(window.location.href.replace(/\/$/, '').replace(/.*//, ''))
Самсон
8
var urlChunks = 'mywebsite/folder/file'.split('/');
alert(urlChunks[urlChunks.length - 1]);
кульминация
источник
5

Я знаю, это слишком поздно, но для других: я настоятельно рекомендую использовать плагин PURL jquery . Мотивация для PURL заключается в том, что url может быть сегментирован тоже с помощью '#' (пример: angular.js links), то есть 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
IL55
источник
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()
Jaboc83
источник
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);
raddevus
источник
Я , наверное , что - то пропустил, но с « test.com/one » LOC заканчивает тем, как: « test.com ». Я думаю, что это должно быть так: 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 ('/')); }
Аллан Раквин
Сбой, если косая черта searchили hash.
Уолф
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);
WALF
источник
Также хочу добавить, что pathnameраздвигает параметры запроса, но hrefне делает.
Макс Хейбер,
3

Чтобы получить последний сегмент вашего текущего окна:

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

RegarBoy
источник
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.
Аарон
2
var pathname = window.location.pathname; // Returns path only
var url      = window.location.href;     // Returns full URL

Скопировано из этого ответа

Роберто Алонсо
источник
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));
Jaison
источник
0

Я использую регулярное выражение и разделить:

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

Dinidiniz
источник
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);

Работает для меня.

sanyaissues
источник
0

Я знаю, что он старый, но если вы хотите получить это из URL, вы можете просто использовать:

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

document.location.pathnameполучает путь от текущего URL. lastIndexOfполучить индекс последнего вхождения следующего регулярного выражения в нашем случае /.. Точка означает любой символ, поэтому он не будет учитываться, если /последний символ в URL. substringразрезает строку между двумя индексами.

Руан Карлос
источник
0

если URL http://localhost/madukaonline/shop.php?shop=79

console.log(location.search); принесу ?shop=79

так что самый простой способ - это использовать location.search

вы можете посмотреть дополнительную информацию здесь и здесь

Dijiflex
источник
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. Уменьшите массив частей пути до последней.
Аарон
источник