jQuery修改URL的GET参数

6

我得到了一个像这样的URL:

http://google.de/test.php?a=b&c=d&e=f

我知道如何仅修改一个 GET 参数,就像这样:(c 是 "h" 而不是 "d")
http://google.de/test.php?a=b&c=h&e=f

并重定向到新的URL,所有其他GET参数应保持不变。

我该如何做到这一点?

8个回答

12

我同意其他答案中提到的最好使用库来完成此任务。

但是,如果你需要一个更简单快速的解决方法,这里提供了基于正则表达式的字符串替换方案。

var url = "http://my.com/page?x=y&z=1&w=34";

var regEx = /([?&]z)=([^#&]*)/g;
var newurl = url.replace(regEx, '$1=newValue');

这里我正在将查询字符串键“z”替换为“newValue”。

看看这个fiddle:http://jsfiddle.net/BuddhiP/PkNsx


1
必须使用/([?&]z)=([^#&]*)/g;而不是/([?&]z)=([^&]*)/g;,因为后者可能会覆盖片段。 - Zulakis

1

如上所述,window.location.search将返回包含?的查询字符串。

然后,我会将它们转换为一个对象(可能使用类似http://github.com/medialize/URI.js的库),以便更轻松地处理参数,例如:var params = { key: value, key1: value1}

然后,您可以修改所需的值并将键值对转换回查询字符串。

完成后,您可以使用window.location将用户移动到下一页。


1
PHP 的一个鲜为人知的特性是,后面对现有参数的命名会覆盖前面的命名。
掌握了这个知识,你可以轻松地执行以下操作:
location.href = location.href + '&c=h';

简单。


如果有一个片段被使用,这难道不会导致问题吗?(例如,http://example.org/file?param1=value1#abc&c=h 是一个无效的URL。) - Zulakis
如果在查询字符串之前没有使用查询字符串,它还会导致无效的URL。例如:http://example.org/file.php&c=h是一个无效的URL。 - Zulakis
@Zulakis 没错,你必须更聪明地处理这个问题。 - Christian

0
我已经编写了一个非常简单的方法,但它只能用于你想要实现的内容:
var url = 'http://google.de/test.php?a=b&c=d&e=f';
var gets =  url.split('.php?');
var ge = gets[1].split('&');
var change = ge[1].split('=');
var change[1] = 'h';
var newUrl = url[0] + '.php?' + ge[0] + '&' + change[0] + '=' + change[1] + '&' + ge[2];

0
你可以尝试这样做:
var changed = "h"; // you can vary this GET parameter

var url = "http://google.de/test.php?a=b&e=f&c=" + changed; // append it to the end

window.location = newurl; // redirect the user to the url

0

由于您的参数可以在任何位置,所以这将很好地工作。

url="http://google.de/test.php?a=b&c=d&e=f";
url=url.replace(/&c=.*&/,"&c=h&")

0

设置或更新URL/查询字符串参数,并使用HTML history.replaceState()更新URL

你可以尝试类似这样的代码:

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) {
        keyRegex = new RegExp('([\?&])' + key + '[^&]*');

        // If param exists already, update it
        if (urlQueryString.match(keyRegex) !== null) {
            params = urlQueryString.replace(keyRegex, "$1" + newParam);
        } else { // Otherwise, add it to end of query string
            params = urlQueryString + '&' + newParam;
        }
    }
    window.history.replaceState({}, "", baseUrl + params);
};

-1

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

将location.search替换为你的新参数,例如"?foo=bar&tic=tac"


虽然这很基础,但我的脑子直接跳过了这个方法,但它是我所做的事情中唯一可行的方法。 - brandito

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