URLからクエリ文字列を削除する


144

JavaScriptのパスからクエリ文字列を削除する簡単な方法は何ですか?window.location.searchを使用するJqueryのプラグインを見ました。それはできません。私の場合のURLは、AJAXから設定される変数です。

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3&SortOrder=dsc'

回答:


346

これを取得する簡単な方法は次のとおりです。

function getPathFromUrl(url) {
  return url.split("?")[0];
}

クエリ文字列が存在しないときにハッシュ(元の質問の一部ではない)も削除したい場合は、もう少し必要です。

function stripQueryStringAndHashFromPath(url) {
  return url.split("?")[0].split("#")[0];
}

編集

@caub(元々は@crl)は、クエリ文字列とハッシュの両方で機能するシンプルなコンボを提案しました(ただし、誰かが問題を抱えている場合に備えて、RegExpを使用しています)。

function getPathFromUrl(url) {
  return url.split(/[?#]/)[0];
}

4
+1 ...この場合、実際にはsplit()がsubstring()より優れています。
Daniel Vassallo

10
それが重要な場合には限界最適化(おそらくありません): split('?', 1)[0]
ボビンス

@ChristianVielma:これ?は文字列リテラルであり、正規表現ではありません。
Robusto

@Robusto申し訳ありませんが、私の悪い...私はそれをJavaでチェックしていました(これは正規表現として解釈されます):(
Christian Vielma 2013

4
ねえロブスト、そしてどうして.split(/[?#]/)[0]
caub 2015年

32

2回目の更新:包括的な回答を提供するために、さまざまな回答で提案されている3つの方法のベンチマークを行っています。

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
var i;

// Testing the substring method
i = 0;
console.time('10k substring');
while (i < 10000) {
    testURL.substring(0, testURL.indexOf('?'));
    i++;
}
console.timeEnd('10k substring');

// Testing the split method
i = 0;
console.time('10k split');
while (i < 10000) {
    testURL.split('?')[0]; 
    i++;
}
console.timeEnd('10k split');

// Testing the RegEx method
i = 0;
var re = new RegExp("[^?]+");
console.time('10k regex');
while (i < 10000) {
    testURL.match(re)[0]; 
    i++;
}
console.timeEnd('10k regex');

Mac OS X 10.6.2上のFirefox 3.5.8での結果:

10k substring:  16ms
10k split:      25ms
10k regex:      44ms

Mac OS X 10.6.2上のChrome 5.0.307.11での結果:

10k substring:  14ms
10k split:      20ms
10k regex:      15ms

substringメソッドは、URLにクエリ文字列が含まれていない場合に空の文字列を返すため、機能が劣ります。他の2つのメソッドは、予想どおり、完全なURLを返します。ただし、特にFirefoxでは、部分文字列メソッドが最も速いことに注意してください。


最初の更新:実際には、Robustoによって提案されたsplit()メソッドは、以前に提案した方法よりも優れています。クエリ文字列がない場合でも機能するためです。

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
testURL.split('?')[0];    // Returns: "/Products/List"

var testURL2 = '/Products/List';
testURL2.split('?')[0];    // Returns: "/Products/List"

元の回答:

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
testURL.substring(0, testURL.indexOf('?'));    // Returns: "/Products/List"

10
O_O確かに非常に包括的ですが、なぜですか?最も柔軟で適切な方法が勝つことは明らかですが、速度はここではまったく問題になりません。
だます

1
@deceze:ちょうど好奇心のために...そして、アンガスの答えのコメントで正規表現メソッドのパフォーマンスについての議論があったので。
Daniel Vassallo、

6
非常に興味深い、ダニエル。また、ページで10KのURL解析を実行する必要がある場合は、別の行を探します。:)
ロブスト

44msで1万回の正規表現一致ができるので、私は実際に少し吹き飛ばされています。将来はもっと使いたいと思います。
TheGerm

12

これは古い質問かもしれませんが、クエリパラメータを削除するためにこの方法を試しました。リロードとクエリパラメータの削除を組み合わせる必要があるため、私にとってはスムーズに機能しているようです。

window.location.href = window.location.origin + window.location.pathname;

また、単純な文字列の追加操作を使用しているので、パフォーマンスは良いと思います。しかし、この回答のスニペットと比較する価値はまだあります


3

簡単な方法は次のようにすることができます

public static String stripQueryStringAndHashFromPath(String uri) {
 return uri.replaceAll(("(\\?.*|\\#.*)"), "");
}

2

RegExを使用している場合...

var newURL = testURL.match(new RegExp("[^?]+"))

1
正規表現は遅いです-簡単で速い方法で行ってください。
アリストス

1
@Angus:インクリメントするのを忘れたため、ループにより「スクリプトがビジーである可能性があります...」と表示されますa++;。テストを修正すると、iMac 2.93Ghz Core 2 Duo上の私のFirefox 3.6では、RegExに8ms、splitメソッドに3msが得られます...それでも答えは+1です。
Daniel Vassallo、2009年

1
ありがとう-数分前に修正しました!-しかし、要点は、
正規表現

1
match()オブジェクトを返します。あなたはおそらくそれを望まないでしょう。それを呼び出すtoString()(または+'')。
ボビンス

1
ボブ-良いキャッチ。実際には、一致の配列(この場合は文字列の配列)を返します。したがって、testURL.match(new RegExp( "[^?] +"))[0]はそれを
実行

2
var path = "path/to/myfile.png?foo=bar#hash";

console.log(
    path.replace(/(\?.*)|(#.*)/g, "")
);

2

url anchorルートとして含まれている)backbone.jsを使用している場合、URL query stringが表示されることがあります。

  1. 以前url anchor

    var url = 'http://example.com?a=1&b=3#routepath/subpath';
  2. url anchor

    var url = 'http://example.com#routepath/subpath?a=1&b=3';

解決:

window.location.href.replace(window.location.search, '');
// run as: 'http://example.com#routepath/subpath?a=1&b=3'.replace('?a=1&b=3', '');

1

標準を使用したアプローチURL

/**
 * @param {string} path - A path starting with "/"
 * @return {string}
 */
function getPathname(path) {
  return new URL(`http://_${path}`).pathname
}

getPathname('/foo/bar?cat=5') // /foo/bar

@Bradは、彼がすべてパス名を後で返すだけの場合、プロトコルは何を重要視しますか?
フール


-3
(() => {
        'use strict';
        const needle = 'SortOrder|Page'; // example
        if ( needle === '' || needle === '{{1}}' ) { 
            return; 
        }           
        const needles = needle.split(/\s*\|\s*/);
        const querystripper = ev => {
                    if (ev) { window.removeEventListener(ev.type, querystripper, true);}
                    try {
                          const url = new URL(location.href);
                          const params = new URLSearchParams(url.search.slice(1));
                          for (const needleremover of needles) {
                                if (params.has(needleremover)) {
                                url.searchParams.delete(needleremover);
                                    window.location.href = url;
                            }
                          }     
                    } catch (ex) { }
        };          
        if (document.readyState === 'loading') {
                 window.addEventListener('DOMContentLoaded', querystripper, true);
        } else {
                 querystripper();
        }
})();

それは私がそれをした方法であり、RegExサポートも持っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.