在javascript中搜索并替换特定的查询字符串参数值

时间:2011-03-24 01:54:14

标签: javascript search replace design-patterns match

我有一个类似这样的字符串:

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值本身可以是一个URL链接,类似于http://google.com?param1=test1&param2=test2。我需要捕获完整的价值,直到第一次&amp ;.

6 个答案:

答案 0 :(得分:55)

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

答案 1 :(得分:3)

根据这个讨论,我已经修复了Chris函数(正则表达式字符串的问题!)

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

答案 2 :(得分:2)

基于这个讨论,我创建了一个引用函数。享受

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

答案 3 :(得分:0)

我一直在寻找这个解决方案好几个小时,最后偶然发现了这个问题。我在这里尝试了所有解决方案。但是在替换url中的特定参数值时仍然存在问题。 让我们以

之类的示例网址

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

,更新后的网址应类似于

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子字符串将被匹配和替换。

答案 4 :(得分:0)

我知道这是一个有点脏的代码,但是我已经实现了我想要的。它替换给定的查询字符串,或者如果尚不存在,则添加新的查询字符串。

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');

请注意,仅当查询字符串参数名称或值中的任何一个包含“ =”和/或“&”字符时,此方法才有效。在那之后将可以正常工作。

答案 5 :(得分:-1)

* 用于查找特定查询字符串并替换其值*

的Java脚本代码
('input.letter').click(function () {
                //0- prepare values
                var qsTargeted = 'letter=' + this.value; //"letter=A";
                var windowUrl = '';
                var qskey = qsTargeted.split('=')[0];
                var qsvalue = qsTargeted.split('=')[1];
                //1- get row url
                var originalURL = window.location.href;
                //2- get query string part, and url
                if (originalURL.split('?').length > 1) //qs is exists
                {
                    windowUrl = originalURL.split('?')[0];
                    var qs = originalURL.split('?')[1];
                    //3- get list of query strings
                    var qsArray = qs.split('&');
                    var flag = false;
                    //4- try to find query string key
                    for (var i = 0; i < qsArray.length; i++) {
                        if (qsArray[i].split('=').length > 0) {
                            if (qskey == qsArray[i].split('=')[0]) {
                                //exists key
                                qsArray[i] = qskey + '=' + qsvalue;
                                flag = true;
                                break;
                            }
                        }
                    }
                    if (!flag)//   //5- if exists modify,else add
                    {
                        qsArray.push(qsTargeted);
                    }
                    var finalQs = qsArray.join('&');
                    //6- prepare final url
                    window.location = windowUrl + '?' + finalQs;
                }
                else {
                    //6- prepare final url
                    //add query string
                    window.location = originalURL + '?' + qsTargeted;
                }
            })
        });