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

44

我有一个字符串,大致是这样的:

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

我需要在这个字符串中搜索test_ref=abc并将其替换为新值。

var updated_test_ref = "xyz";

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

i.e

www.google.com/test_ref=xyz.

我们应该怎么做?

编辑:

test_ref的值本身可以是一个URL链接,类似于http://google.com?param1=test1&param2=test2。我需要捕获完整的值而不是只到第一个&。


3
可能是JavaScript中使用正则表达式替换字符串的重复问题。 - Jon
1
这个问题已经被问了无数次。你先尝试搜索了吗? - Jon
不,它类似但不是重复的。我不知道test_ref的值,因为它是一个查询字符串参数,其值随不同页面而变化。另外,我需要用变量updated_test_ref的值替换该值。这不是一个固定的值。我首先需要捕获test_ref后面的所有内容,就像这样的字符串.replace(/test_ref=(.*)?/),然后只需用updated_test_ref的值替换匹配部分。 - TopCoder
1
嗨Jon,是的,我试过了,但是我无法得到我特别想要的东西。 - TopCoder
@Jon - 请看我的标题更新。鉴于@cwolves的回答,这不仅仅是你链接的重复(虽然可能是其他东西的重复(我还没有看))。 - Wayne
可能是重复的问题:更改URL参数 - Sindre Sorhus
6个回答

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

8
解释:字面上匹配字符串“test_ref =”,后跟一个或多个不是查询字符串参数分隔符(“&”)的内容,并用捕获的匹配项(“test_ref =”)替换,后跟变量updated_test_ref的值。 - Wayne
2
@TopCoder - 这种问题不需要问。只需获取Firebug并在控制台中测试即可。 “如果发生了什么?”几乎从来都不是一个好问题。只需尝试一下即可。 - Wayne
14
实际上,我认为更好的方法是使用 /([?|&]test_ref=)[^&]+/,因为你可以有另一个参数,它以 test_ref 结尾。 - Panthro
嗨,为了让它更好,我们如何使正则表达式不区分大小写?@lwburk - Franva
只需在正则表达式的末尾添加 ignorecase (i) 标志,就像这样:/(test_ref=)[^\&]+/i - Wayne

4

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

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

1
你最近的两条评论只是在重申已被接受的答案,请只回答那些你有比已接受的答案提供更多信息的已解决问题。如果没有,请直接点赞已接受的答案。 - ylerjen

2
我正在寻找这个解决方案已经几个小时了,最终偶然发现了这个问题。我已经尝试了这里的所有解决方案。但是在替换URL中特定参数值时仍然存在问题。 让我们拿一个示例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);
}

这里的正则表达式 (?<=[?|&]) 的意思是,它会匹配 '?' 或 '&' 字符,并且会取出该字符之后的字符串(向该字符后方查找)。这意味着只有 param1=test1 子字符串会被匹配并替换。

垃圾代码。updateUrlParameter("/fileserver.aspx?mid=1&t=SGK&id=0&f=File2&p=w","id","23954"); 返回 "/fileserver.aspx?mid=1&t=SGK&id=id=23954&f=File2&p=w"。 - Roni Tovi
已经修正了这一行中的小错误:return url.replace(regex, param + '=$1' + value);。之前没有注意到,感谢指出。正确版本应该是:return url.replace(regex, param + '=' + value); - souravb
1
正向后瞻,即?<=在许多浏览器中不受支持。替代方法是使用单词边界,即\b。例如:queryString.replace(/\bsource=[^&]+/, 'source=' + value),其中source是我们感兴趣的参数名称。 - Aakash Goplani

2
基于这次讨论,我创建了一个参考文献函数。享受它吧。
updateUrlParameter(url, param, value){
    var regex = new RegExp("/([?|&]" + param + "=)[^\&]+/");
    return url.replace(regex, '$1' + value);
}

4
我曾经费了很大精力才让它工作,直到我意识到你需要删除前导和结尾的正斜杠。我猜这些正斜杠会自动添加,如果你将它们放入字符串中,它们最终会出现两次。 - Ryan Ewen

1
我知道这段代码有些不规范,但我已经达到了我想要的效果。它会替换给定的查询字符串,如果查询字符串不存在,则会添加一个新的查询字符串。
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');

请注意,只有当查询字符串参数名称或值中包含“=”和/或“&”字符时,它才不起作用。在那之后,它将正常工作。


-1

*查找特定查询字符串并替换其值的 Java Script 代码 *

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接