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
Ravi Shankar Kota

回答:


369

また、lastIndexOf()関数を使用/して、URL内で最後に出現する文字を検索し、次にsubstring()関数を使用して、その場所から始まる部分文字列を返すこともできます。

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

こうすることで、すべてのURLセグメントを含む配列の作成を避けますsplit()


3
@oshirowanen、いいえ、ただし各URLセグメントから配列要素が作成されます。最後のセグメントのみに関心があるので、使用しない配列要素を多数割り当てるのは無駄になる可能性があります。
フレデリックハミディ2011年

11
しかし、URLがadmin/store/tour/-1/そのようになった場合、それは''文字列になりますか?
Kyar Wa Larを

1
@セット、多分もっと良い、確かに遅い。
フレデリックハミディ

1
URL /の末尾にが含まれている場合はどうなりますか?
Sнаđошƒаӽ

6
対象:@Set Kyar Wa Lar Augおよび/最後にaを含むURLの@Sнаđошƒаӽソリューション: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/
Peter Ludlow、

@PeterLudlowはChrome 76で動作します。詳しく説明して
もらえ

1
@PeterLudlowは、JSアブストラクト"" == falseでは空の文字列がfalseであるため機能します。その場合、配列の一部に空の文字列が
ポップされ

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

2
シンプルで簡単。ありがとう。
krezaeim 2018

3
完璧で整頓された、素晴らしい
Babak Habibi

1
美しくクリーンな対応
Zarkys Salas

1
これはまさに私が探していたものです。react-router-domを使用すると、URLの最後の部分に最後のスラッシュが付いていることがわかりました/console.log(history.location.pathname.split("/").pop()) もっと良い方法があれば知りたい!うまくいけば、このコメントがあなたの答えにより多くの人々を導くことができるでしょう。ありがとう@ Dblock247
Tralawar

補足:URLにクエリパラメータが設定されている場合(たとえば.../file?var=value&foo=bar)、これは機能しません。このソリューションは、この問題をより堅牢で最新の方法で解決します:stackoverflow.com/a/51795122/1123743
Sebastian Barth

30

正規表現によるちょうど別のソリューション。

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

ありがとうございます。
サリルシャルマ

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の場合は、ポリフィルも利用できます(まったくにする場合)。



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

5

もう手遅れですが、他の人にとっては、PURL jqueryプラグインの使用を強くお勧めします。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

分割を使用して追加の要素を生成することについて心配していない場合、フィルターは末尾のスラッシュについて言及している問題を処理できます(フィルターがブラウザーでサポートされている場合)。

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

あなたの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」のようになります。私はそれが次のようになるはずだと思います: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

searchまたはでスラッシュすると失敗しhashます。
Walf

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

ネイティブpathnameプロパティは最も簡単で、ブラウザによって既に解析および解決されているため、使用してください。正しい結果が得られない$(this).attr("href")ような値を返す可能性../..があります。

を保持する必要がある場合(searchおよびから)これを使用します。hashfoo?bar#bazhttp://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

部分文字列を実行する前に、末尾のスラッシュ( '/')を削除する方が安全だと思います。私のシナリオでは空の文字列を取得したためです。

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- >返品CardsRealm

https://cardsrealm.com/profile/cardsRealm#hello- >返品カードRealm

https://cardsrealm.com/profile/cardsRealm?hello- >カードの返却

https://cardsrealm.com/profile/cardsRealm/- >返品CardsRealm


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次の正規表現の最後の出現のインデックスを取得します/.。この場合はです。ドットは任意の文字を意味するため、/URLの最後の文字であるかどうかはカウントされません。 substring2つのインデックスの間の文字列をカットします。


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.