JavaScriptでクエリ文字列パラメーターを削除するにはどうすればよいですか?


127

正規表現を使用する以外に、標準のJavaScriptでURL文字列のクエリ文字列からパラメーターを削除するより良い方法はありますか?

これは私がこれまでに思いついたもので、私のテストでは機能しているようですが、クエリ文字列の解析を再発明したくありません!

function RemoveParameterFromUrl( url, parameter ) {

    if( typeof parameter == "undefined" || parameter == null || parameter == "" ) throw new Error( "parameter is required" );

    url = url.replace( new RegExp( "\\b" + parameter + "=[^&;]+[&;]?", "gi" ), "" ); "$1" );

    // remove any leftover crud
    url = url.replace( /[&;]$/, "" );

    return url;
}

回答:


178
"[&;]?" + parameter + "=[^&;]+"

パラメータ 'bar'が一致するため、危険なようです:

?a=b&foobar=c

また、parameter「。」など、RegExpで特別な文字が含まれていると失敗します。また、これはグローバル正規表現ではないため、パラメーターの1つのインスタンスのみが削除されます。

これには単純なRegExpを使用しません。パラメーターを解析して、不要なパラメーターを失います。

function removeURLParameter(url, parameter) {
    //prefer to use l.search if you have a location/link object
    var urlparts = url.split('?');   
    if (urlparts.length >= 2) {

        var prefix = encodeURIComponent(parameter) + '=';
        var pars = urlparts[1].split(/[&;]/g);

        //reverse iteration as may be destructive
        for (var i = pars.length; i-- > 0;) {    
            //idiom for string.startsWith
            if (pars[i].lastIndexOf(prefix, 0) !== -1) {  
                pars.splice(i, 1);
            }
        }

        return urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : '');
    }
    return url;
}

foob​​arに一致するバーの良い点。元の正規表現を更新して、?または最初の[&;]。また、それを検討するためにソリューションを読んでください...
Matthew Lock

5
「?」を削除したい場合 削除後にパラメーターがない場合は、pars.length == 0かどうかをテストするif条件を追加し、それが0の場合は、「?」を追加する代わりに「url = urlparts [0]」を作成します。
johnmcaliley 2010年

2
URLフラグメントをencodeURIComponent(parameter)と比較しても安全ですか?URLがパラメーター名を異なる方法でエンコードした場合はどうなりますか?たとえば、「two%20words」と「two + words」の比較です。これに対処するには、パラメータ名をデコードして、通常の文字列と比較する方がよい場合があります。
Adrian Pronk 2013年

9
軽度の改善により、最終的なURLパラメータが削除されたときに「?」も削除されます:行url= urlparts[0]+'?'+pars.join('&');url= urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : "");
Cody S

2
@ ktutnik / @ JonasAxelsson URLクエリパラメータでは、大文字と小文字は区別されません。
ボビンス

30

最新のブラウザーURLSearchParams、検索パラメーターを操作するためのインターフェースを提供します。これは持っているdelete名前でのparamを削除する方法を。

if (typeof URLSearchParams !== 'undefined') {
  const params = new URLSearchParams('param1=1&param2=2&param3=3')
  
  console.log(params.toString())
  
  params.delete('param2')
  
  console.log(params.toString())

} else {
  console.log(`Your browser ${navigator.appVersion} does not support URLSearchParams`)
}


2
URLSearchParamsIE、Edge 16、iOS 10.2 Safariではサポートされていないことに注意してください。(参照:caniuse.com/#feat=urlsearchparams
khiav reoy 2018

3
@khiavreoyうん。回答の最初の2つの単語と同じように、同じリンクを提供します:)
Yury Tarabanko

23

bobince回答からコピーしましたが、クエリ文字列内の疑問符をサポートするようにしました。例:

http://www.google.com/search?q=test???+something&aq=f

URLに複数の疑問符を含めることは有効ですか?

function removeUrlParameter(url, parameter) {
  var urlParts = url.split('?');

  if (urlParts.length >= 2) {
    // Get first part, and remove from array
    var urlBase = urlParts.shift();

    // Join it back up
    var queryString = urlParts.join('?');

    var prefix = encodeURIComponent(parameter) + '=';
    var parts = queryString.split(/[&;]/g);

    // Reverse iteration as may be destructive
    for (var i = parts.length; i-- > 0; ) {
      // Idiom for string.startsWith
      if (parts[i].lastIndexOf(prefix, 0) !== -1) {
        parts.splice(i, 1);
      }
    }

    url = urlBase + '?' + parts.join('&');
  }

  return url;
}

2
これ???は無効な構文であり、URLで発生することはありません。

@torazaburo私が投稿したstackoverflowの質問を見てください:「URLに複数の疑問符を含めることは有効ですか?」、答えはイエスのようです。また、これは何年も前のことなので、詳細を思い出せませんが、これが正しく処理されなかったときに問題が発生しました。
LukePH 2016

それらが実世界に存在しないと言っているのではなく、おそらくそれらを処理できるようにしたいと思うでしょうが、適切に形成されたURLでは、疑問符は「予約済み文字」であり、疑問符以外のものクエリパラメータの導入はURLエンコードする必要があります。

1
return url.endsWith("?") ? url.slice(0,-1) : url;削除するパラメーターがクエリ文字列内の唯一のパラメーターである場合をカバーするために、最後の行をに置き換えることができます
Konamiman

@Konamimanこれは、たとえばgoogle.com/search?q=test???&aq=fから 'aq'を削除するときにパラメーターデータを変更しますが、私はあなたが何を意味するかを理解しています。 ?害はありません。ロジックは最後を確認する必要があるだけですか?また、最初のですか?
LukePH 2016年

21

正規表現ソリューションで大きな問題は見当たりません。ただし、フラグメント識別子(の後のテキスト#)を保存することを忘れないでください。

これが私の解決策です:

function RemoveParameterFromUrl(url, parameter) {
  return url
    .replace(new RegExp('[?&]' + parameter + '=[^&#]*(#.*)?$'), '$1')
    .replace(new RegExp('([?&])' + parameter + '=[^&]*&'), '$1');
}

そして、ボビンスの要点として、はい- .パラメーター名の文字をエスケープする必要があります。


1
これは、パラメーターに値がない場合(例: 'ex.com?removeMe')に機能し、フラグメント(例: 'ex.com?#&dont=removeMe')またはパス(例: ' ex.com/&dont=removeMe '):url.replace(new RegExp('^([^#]*\?)(([^#]*)&)?' + parameter + '(\=[^&#]*)?(&|#|$)' ), '$1$3$5').replace(/^([^#]*)((\?)&|\?(#|$))/,'$1$3$4')
Stephen M. Harris

これはスティーブン・M・ハリスでは機能しません。コードにパラメーターとして空の文字列を与え、何が起こるかを確認してください...
David Fischer

15

次の方法でURLを変更できます。

window.history.pushState({}, document.title, window.location.pathname);

このようにして、検索パラメーターなしでURLを上書きできます。GETパラメーターを受け取った後、それを使用してURLをクリーンアップします。


13

正規表現ソリューションに興味のある人なら誰でも、この関数を組み合わせてクエリ文字列パラメーターを追加/削除/更新しました。値を指定しないとパラメーターが削除され、値を指定するとパラメーターが追加/更新されます。URLが指定されていない場合は、window.locationから取得されます。このソリューションでは、URLのアンカーも考慮されます。

function UpdateQueryString(key, value, url) {
    if (!url) url = window.location.href;
    var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi"),
        hash;

    if (re.test(url)) {
        if (typeof value !== 'undefined' && value !== null)
            return url.replace(re, '$1' + key + "=" + value + '$2$3');
        else {
            hash = url.split('#');
            url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
            if (typeof hash[1] !== 'undefined' && hash[1] !== null) 
                url += '#' + hash[1];
            return url;
        }
    }
    else {
        if (typeof value !== 'undefined' && value !== null) {
            var separator = url.indexOf('?') !== -1 ? '&' : '?';
            hash = url.split('#');
            url = hash[0] + separator + key + '=' + value;
            if (typeof hash[1] !== 'undefined' && hash[1] !== null) 
                url += '#' + hash[1];
            return url;
        }
        else
            return url;
    }
}

更新

クエリ文字列の最初のパラメータを削除するときにバグがありました。正規表現を修正し、修正を含めるようにテストしました。

アップデート2

ハッシュタグの直前にクエリ文字列変数を削除するとハッシュタグシンボルが失われる状況を修正する@schellmax更新


1
2つのクエリ文字列があり、最初の文字列を削除する場合、これは機能しません。渡されたURLは、?保存する必要がある場合は削除されます。
Blake Niemyjski 2013年

1
@BlakeNiemyjskiそのバグを発見してくれてありがとう。最初のパラメータの回避策を含めるようにスクリプトを更新しました
ellemayo

1
偶然ここにハッシュを削除します:UpdateQueryString('a', null, 'http://www.test.com?a=b#c');
schellmax

クールな機能、ありがとう。参考までに、これをeach() `ループで配列のキーを無視して使用しながら、url置換の繰り返しごとに縮小を定義する必要がある場合があります。ただし、valueこれは引数にa を入力する必要があることを意味し、クエリ文字列の半分が削除されたままになります。、これに対抗するには、使用undefinedまたはnullのためにvalue:のような引数url_from_last_iteration = UpdateQueryString(current_ignore_key, undefined/null, url_from_last_iteration);
dhaupin

7

URIからkey = valパラメータを削除したい場合:

function removeParam(uri) {
   return uri.replace(/([&\?]key=val*$|key=val&|[?&]key=val(?=#))/, '');
}

正常に機能しますが、正規表現の最初の疑問符をエスケープする必要はなく、リンターエラーが発生する可能性があります/([&?]key=val*$|key=val&|[?&]key=val(?=#))/。eslintのようなリンターを使用する場合に適している可能性があります
quetzaluz

7

これが私が使っているものです:

if (location.href.includes('?')) { 
    history.pushState({}, null, location.href.split('?')[0]); 
}

元のURL:http : //www.example.com/test/hello?
id = 123&foo = barリンク先URL:http : //www.example.com/test/hello


このコードはページの読み込み時に記述しますか?私がこれをページの読み込みかそうでないかを書いているときにそれが機能しないので、私はあなたに尋ねます。
noobprogrammer

6

この質問とこのgithub gistに基づいてパラメーターを追加および削除するための完全な関数を次に示します。https//gist.github.com/excalq/2961415

var updateQueryStringParam = function (key, value) {

    var baseUrl = [location.protocol, '//', location.host, location.pathname].join(''),
        urlQueryString = document.location.search,
        newParam = key + '=' + value,
        params = '?' + newParam;

    // If the "search" string exists, then build params from it
    if (urlQueryString) {

        updateRegex = new RegExp('([\?&])' + key + '[^&]*');
        removeRegex = new RegExp('([\?&])' + key + '=[^&;]+[&;]?');

        if( typeof value == 'undefined' || value == null || value == '' ) { // Remove param if value is empty

            params = urlQueryString.replace(removeRegex, "$1");
            params = params.replace( /[&;]$/, "" );

        } else if (urlQueryString.match(updateRegex) !== null) { // If param exists already, update it

            params = urlQueryString.replace(updateRegex, "$1" + newParam);

        } else { // Otherwise, add it to end of query string

            params = urlQueryString + '&' + newParam;

        }

    }
    window.history.replaceState({}, "", baseUrl + params);
};

次のようなパラメーターを追加できます。

updateQueryStringParam( 'myparam', 'true' );

次のように削除します。

updateQueryStringParam( 'myparam', null );

このスレッドでは、正規表現はおそらく最良/安定した解決策ではないと多くの人が言いました...したがって、このことにいくつかの欠陥があるかどうかは100%わかりませんが、私がテストした限りでは、かなりうまく機能します。


5

これは、クリーンなバージョンで削除クエリパラメータ付きURLクラス今日のブラウザ用:

function removeUrlParameter(url, paramKey)
{
  var r = new URL(url);
  r.searchParams.delete(paramKey);
  return r.href;
}

古いブラウザではURLSearchParamsはサポートされていません

https://caniuse.com/#feat=urlsearchparams

IE、Edge(17未満)およびSafari(10.3未満)は、URLクラス内のURLSearchParamsをサポートしていません。

ポリフィル

URLSearchParamsのみのポリフィル

https://github.com/WebReflection/url-search-params

最新のWHATWG仕様に一致するように、ポリフィルURLとURLSearchParamsを完成させます。

https://github.com/lifaon74/url-polyfill


4

jQueryの使用:

function removeParam(key) {
    var url = document.location.href;
    var params = url.split('?');
    if (params.length == 1) return;

    url = params[0] + '?';
    params = params[1];
    params = params.split('&');

    $.each(params, function (index, value) {
        var v = value.split('=');
        if (v[0] != key) url += value + '&';
    });

    url = url.replace(/&$/, '');
    url = url.replace(/\?$/, '');

    document.location.href = url;
}

3

関数としての上記のバージョン

function removeURLParam(url, param)
{
 var urlparts= url.split('?');
 if (urlparts.length>=2)
 {
  var prefix= encodeURIComponent(param)+'=';
  var pars= urlparts[1].split(/[&;]/g);
  for (var i=pars.length; i-- > 0;)
   if (pars[i].indexOf(prefix, 0)==0)
    pars.splice(i, 1);
  if (pars.length > 0)
   return urlparts[0]+'?'+pars.join('&');
  else
   return urlparts[0];
 }
 else
  return url;
}


2

私が見ることができるものから、上記のどれも通常のパラメータと配列パラメータを処理することができません。ここにあるものがあります。

function removeURLParameter(param, url) {
    url = decodeURI(url).split("?");
    path = url.length == 1 ? "" : url[1];
    path = path.replace(new RegExp("&?"+param+"\\[\\d*\\]=[\\w]+", "g"), "");
    path = path.replace(new RegExp("&?"+param+"=[\\w]+", "g"), "");
    path = path.replace(/^&/, "");
    return url[0] + (path.length
        ? "?" + path
        : "");
}

function addURLParameter(param, val, url) {
    if(typeof val === "object") {
        // recursively add in array structure
        if(val.length) {
            return addURLParameter(
                param + "[]",
                val.splice(-1, 1)[0],
                addURLParameter(param, val, url)
            )
        } else {
            return url;
        }
    } else {
        url = decodeURI(url).split("?");
        path = url.length == 1 ? "" : url[1];
        path += path.length
            ? "&"
            : "";
        path += decodeURI(param + "=" + val);
        return url[0] + "?" + path;
    }
}

どうやって使うのですか:

url = location.href;
    -> http://example.com/?tags[]=single&tags[]=promo&sold=1

url = removeURLParameter("sold", url)
    -> http://example.com/?tags[]=single&tags[]=promo

url = removeURLParameter("tags", url)
    -> http://example.com/

url = addURLParameter("tags", ["single", "promo"], url)
    -> http://example.com/?tags[]=single&tags[]=promo

url = addURLParameter("sold", 1, url)
    -> http://example.com/?tags[]=single&tags[]=promo&sold=1

もちろん、パラメーターを更新するには、削除してから追加するだけです。そのためのダミー関数を自由に作成してください。


path.replace(new RegExp("&?"+param+"=[\\w]+", "g"), "");正規表現を変更して、[\\w]*「param =」のようなパラメータを値なしで含めるようにします。
Tomas Prado

2

このスレッドのすべての応答には、URLのアンカー/フラグメント部分を保持しないという欠陥があります。

したがって、URLが次のようになっているとします。

http://dns-entry/path?parameter=value#fragment-text

そして、あなたは「パラメータ」を置き換えます

フラグメントテキストは失われます。

以下は、この問題に対処する以前の回答(LukePHを介したボビンス)の適応です。

function removeParameter(url, parameter)
{
  var fragment = url.split('#');
  var urlparts= fragment[0].split('?');

  if (urlparts.length>=2)
  {
    var urlBase=urlparts.shift(); //get first part, and remove from array
    var queryString=urlparts.join("?"); //join it back up

    var prefix = encodeURIComponent(parameter)+'=';
    var pars = queryString.split(/[&;]/g);
    for (var i= pars.length; i-->0;) {               //reverse iteration as may be destructive
      if (pars[i].lastIndexOf(prefix, 0)!==-1) {   //idiom for string.startsWith
        pars.splice(i, 1);
      }
    }
    url = urlBase + (pars.length > 0 ? '?' + pars.join('&') : '');
    if (fragment[1]) {
      url += "#" + fragment[1];
    }
  }
  return url;
}

1
軽度の改善により、最終的なURLパラメータが削除されたときに「?」も削除されます:行url = urlBase+'?'+pars.join('&');url = urlBase + (pars.length > 0 ? '?' + pars.join('&') : "");
Cody S

#が最初に来るとどうなりますか?dns-entry / path#fragment-text?parameter = value
ajayv

2

ここでのソリューション:

  1. URLSearchParamsを使用します(正規表現を理解するのは難しくありません)
  2. リロードせずに検索バーのURL更新します
  3. URLの他のすべての部分(ハッシュなど)を維持します
  4. ?最後のパラメータが削除された場合、クエリ文字列から余分なもの削除します
function removeParam(paramName) {
    let searchParams = new URLSearchParams(window.location.search);
    searchParams.delete(paramName);
    if (history.replaceState) {
        let searchString = searchParams.toString().length > 0 ? '?' + searchParams.toString() : '';
        let newUrl = window.location.protocol + "//" + window.location.host + window.location.pathname +  searchString + window.location.hash;
        history.replaceState(null, '', newUrl);
    }
}

注:他の回答で指摘されているように、URLSearchParamsはIEではサポートされていないため、ポリフィルを使用してください


2

のインスタンスの場合はURL、次のdelete関数を使用しますsearchParams

let url = new URL(location.href);
url.searchParams.delete('page');

1

別の直接的な簡単な答えは

let url = new URLSearchParams(location.search)
let key = 'some_key'

return url.has(key)
    ? location.href.replace(new RegExp(`[?&]${key}=${url.get(key)}`), '')
    : location.href

0

ssh_imovによるソリューションの修正バージョン

function removeParam(uri, keyValue) {
      var re = new RegExp("([&\?]"+ keyValue + "*$|" + keyValue + "&|[?&]" + keyValue + "(?=#))", "i"); 
      return uri.replace(re, '');
    }

このような電話

removeParam("http://google.com?q=123&q1=234&q2=567", "q1=234");
// returns http://google.com?q=123&q2=567

param convert spaceの値を%20に送信するときに留意すべき1つのこと
xeon zolt

0

これは、GETパラメータなしのURLを返します。

var href = document.location.href;
var search = document.location.search;
var pos = href.indexOf( search );
if ( pos !== -1 ){
    href = href.slice( 0, pos );
    console.log( href );
}

0

実際に次の関数を記述して、URLパラメータを処理し、最終ステータスを文字列として取得して、ページをリダイレクトします。うまくいけば、それは利益になります。

function addRemoveUrlQuery(addParam = {}, removeParam = [], startQueryChar = '?'){

    let urlParams = new URLSearchParams(window.location.search);

    //Add param
    for(let i in addParam){
        if(urlParams.has(i)){ urlParams.set(i, addParam[i]); }
        else                { urlParams.append(i, addParam[i]); }
    }

    //Remove param
    for(let i of removeParam){
        if(urlParams.has(i)){
            urlParams.delete(i);
        }
    }

    if(urlParams.toString()){
        return startQueryChar + urlParams.toString();
    }

    return '';
}

たとえば、ボタンをクリックすると、ページの値が削除され、カテゴリの値が追加されます。

let button = document.getElementById('changeCategory');
button.addEventListener('click', function (e) {

    window.location = addRemoveUrlQuery({'category':'cars'}, ['page']);

});

とても役に立ったと思います!


0

ここをスクロールしてください。

次の可能な解決策によってこのタスクを解決することをお勧めします:

  1. 最新のブラウザー(Edge> = 17)のみをサポートする必要があります-URLSearchParams.delete()APIを使用してください。これはネイティブであり、明らかにこのタスクを解決する最も便利な方法です。
  2. これがオプションではない場合、これを行う関数を作成することができます。 このような関数
    • パラメータが存在しない場合はURLを変更しないでください
    • 次のように、値のないURLパラメータを削除します http://google.com/?myparm
    • 次のような値を持つURLパラメータを削除する http://google.com/?myparm=1
    • のようにURLに2回ある場合、URLパラメータを削除します http://google.com?qp=1&qpqp=2&qp=1
    • 使用しない forループをループ中に配列を変更
    • より機能的です
    • 正規表現ソリューションよりも読みやすいです
    • 使用する前に、URLがエンコードされていないことを確認してください

IEで動作> 9(ES5バージョン)

function removeParamFromUrl(url, param) {  // url: string, param: string
  var urlParts = url.split('?'),
      preservedQueryParams = '';

  if (urlParts.length === 2) {
    preservedQueryParams = urlParts[1]
      .split('&')
      .filter(function(queryParam) {
        return !(queryParam === param || queryParam.indexOf(param + '=') === 0)
      })
      .join('&');
  }

  return urlParts[0] +  (preservedQueryParams && '?' + preservedQueryParams); 
}

ファンシーES6バージョン

function removeParamFromUrlEs6(url, param) {
  const [path, queryParams] = url.split('?');
	let preservedQueryParams = '';

  if (queryParams) {
    preservedQueryParams = queryParams
      .split('&')
      .filter(queryParam => !(queryParam === param || queryParam.startsWith(`${param}=`)))
      .join('&');
  }

  return `${path}${preservedQueryParams && `?${preservedQueryParams}`}`;  
}

ここでそれがどのように機能するかを見てください


0
function removeParamInAddressBar(parameter) {
    var url = document.location.href;
    var urlparts = url.split('?');

    if (urlparts.length >= 2) {
        var urlBase = urlparts.shift();
        var queryString = urlparts.join("?");

        var prefix = encodeURIComponent(parameter) + '=';
        var pars = queryString.split(/[&;]/g);
        for (var i = pars.length; i-- > 0;) {
            if (pars[i].lastIndexOf(prefix, 0) !== -1) {
                pars.splice(i, 1);
            }
        }

        if (pars.length == 0) {
            url = urlBase;
        } else {
            url = urlBase + '?' + pars.join('&');
        }

        window.history.pushState('', document.title, url); // push the new url in address bar
    }
    return url;
}

-1
const params = new URLSearchParams(location.search)
params.delete('key_to_delete')
console.log(params.toString())

これは非常に古く、すでに受け入れられている質問への回答です。この回答が他の回答と新しく/異なる点を提供するために何を提供するか説明してください。また、回答にはコードだけでなく説明も含める必要があります。
nurdyguy


-2
function removeQueryStringParameter(uri, key, value) 
{

var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");

    var separator = uri.indexOf('?') !== -1 ? "&" : "?";

    if (uri.match(re)) {

        return uri.replace(re, '');

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