web-dev-qa-db-ja.com

JavaScriptで特定のクエリ文字列パラメーター値を検索して置換する

私は次のような文字列を持っています:

a_href= "www.google.com/test_ref=abc";

上記のstrinngでtest_ref = abcを検索し、新しい値に置き換える必要があります

var updated_test_ref = "xyz";

a_href ="www.google.com/test_ref=updated_test_ref" 

すなわち

www.google.com/test_ref=xyz.

どうすればこれができますか?

編集:

test_ref値は、それ自体が http://google.com?param1=test1&param2=test2 のようなURLリンクになります。最初の&までではなく、完全な価値を獲得する必要があります。

35
TopCoder
a_href = a_href.replace(/(test_ref=)[^\&]+/, '$1' + updated_test_ref);
56
Mark Kahn

この議論に基づいて、Chris関数を修正しました(正規表現文字列の問題!)

function updateUrlParameter(url, param, value){
    var regex = new RegExp('('+param+'=)[^\&]+');
    return url.replace( regex , '$1' + value);
}
3
Nejc Lepen

この議論に基づいて、参照関数を作成しました。楽しい

updateUrlParameter(url, param, value){
    var regex = new RegExp("/([?|&]" + param + "=)[^\&]+/");
    return url.replace(regex, '$1' + value);
}
2
Chris

私はこのソリューションを数時間探していましたが、ついにこの質問に出くわしました。ここですべてのソリューションを試しました。ただし、urlの特定のparam値を置き換える際にはまだ問題があります。次のようなサンプルURLを見てみましょう

http://google.com?param1=test1&param2=test2&anotherparam1=test3

更新されたURLは次のようになります

http://google.com?param1=newtest&param2=test2&anotherparam1=test3、ここでparam1の値が変更されます。

この場合、@ Panthro が指摘したように、クエリ文字列の前に[?|&]を追加すると、anotherparam1が置換されないことが保証されます。しかし、このソリューションは「?」も追加します。または一致する文字列に「&」文字。そのため、一致した文字を置き換える間、「?」または「&」も置き換えられます。どの文字が置き換えられるのか正確にはわからないので、その文字を追加することもできません。

解決策は「?」と一致させることですまたは、先行文字としてのみ「&」。

@ Chris の関数を書き直し、文字列の問題を修正し、大文字と小文字を区別しない引数を追加しました。

updateUrlParameter(url, param, value){
    var regex = new RegExp('(?<=[?|&])(' + param + '=)[^\&]+', 'i');
    // return url.replace(regex, param + '=$1' + value);
    return url.replace(regex, param + '=' + value);
}

ここで(?<=[?|&])は、正規表現が「?」と一致することを意味しますまたは '&' charで、指定された文字の後ろにある文字列を取得します(文字の後ろに見えます)。つまり、param1=test1部分文字列のみが一致して置換されます。

1
souravb

私はこれが少し汚いコードであることを知っていますが、私が探していたものを達成しました。指定されたクエリ文字列を置き換えるか、まだ存在しない場合は新しいものを追加します。

function updateUrlParameter(url, param, value) {

    var index = url.indexOf("?");

    if (index > 0) {

        var u = url.substring(index + 1).split("&");

        var params = new Array(u.length);

        var p;
        var found = false;

        for (var i = 0; i < u.length; i++) {
            params[i] = u[i].split("=");
            if (params[i][0] === param) {
                params[i][1] = value;
                found = true;
            }
        }

        if (!found) {
            params.Push(new Array(2));
            params[params.length - 1][0] = param;
            params[params.length - 1][1] = value;
        }

        var res = url.substring(0, index + 1) + params[0][0] + "=" + params[0][1];
        for (var i = 1; i < params.length; i++) {
            res += "&" + params[i][0] + "=" + params[i][1];
        }
        return res;

    } else {
        return url + "?" + param + "=" + value;
    }

}

次のような通常のURLアドレスを指定すると機能します。

updateUrlParameter('https://www.example.com/some.aspx?mid=1&id=2','id','5');
updateUrlParameter('https://www.example.com/?mid=1&id=2','id','5');
updateUrlParameter('https://www.example.com/some.aspx','id','5');

注意クエリ文字列のパラメータ名または値のいずれかに「=」および/または「&」文字が含まれている場合のみ機能しません。その背後でうまく機能します。

0
Roni Tovi