Javascript 如何从url查询中删除参数?
我正在尝试从url查询字符串中删除一些参数Javascript 如何从url查询中删除参数?,javascript,regex,Javascript,Regex,我正在尝试从url查询字符串中删除一些参数 var query = '?'; for (var prop in parameters) { query += prop + '=' + parameters[prop] + '&'; }; query = query.substr(0, query.length - 1); 我有一组要删除的参数: var queryParamsToRemove = ['destination','formName']; 我试图做的是搜索u
var query = '?';
for (var prop in parameters)
{
query += prop + '=' + parameters[prop] + '&';
};
query = query.substr(0, query.length - 1);
我有一组要删除的参数:
var queryParamsToRemove = ['destination','formName'];
我试图做的是搜索url中的每个参数,并使用RegExp
删除它。大概是这样的:
for (param in queryParamsToRemove){
patt = new RegExp(param,'g');
queryString = queryString.replace('&' + patt + '=' + /*?=&/g,'');
}
unparam = function (value) {
var
// Object that holds names => values.
params = [],
// Get query string pieces (separated by &)
pieces = value.split('&'),
// Temporary variables used in loop.
pair, i, l;
// Loop through query string pieces and assign params.
for (i = 0, l = pieces.length; i < l; i++) {
pair = pieces[i].split('=', 2);
// Repeated parameters with the same name are overwritten. Parameters
// with no value get set to boolean true.
params[decodeURIComponent(pair[0])] = (pair.length == 2 ?
decodeURIComponent(pair[1].replace(/\+/g, ' ')) : true);
}
return params;
};
var query = unparam(querystr);
for(var i in queryParamsToRemove) {
delete query[queryParamsToRemove[i]];
}
但这不起作用,因为语法问题,我想。要回答您真正的问题:
for (param in queryParamsToRemove){
queryString = queryString.replace(new RegExp('[&\?]' + queryParamsToRemove[param] + '=.*(&?)', 'g'), '\1');
}
这应该行得通
否则,您可以使用这样的函数:(只需从函数名中删除jQuery
,就可以在没有任何库的情况下使用它)
大概是这样的:
for (param in queryParamsToRemove){
patt = new RegExp(param,'g');
queryString = queryString.replace('&' + patt + '=' + /*?=&/g,'');
}
unparam = function (value) {
var
// Object that holds names => values.
params = [],
// Get query string pieces (separated by &)
pieces = value.split('&'),
// Temporary variables used in loop.
pair, i, l;
// Loop through query string pieces and assign params.
for (i = 0, l = pieces.length; i < l; i++) {
pair = pieces[i].split('=', 2);
// Repeated parameters with the same name are overwritten. Parameters
// with no value get set to boolean true.
params[decodeURIComponent(pair[0])] = (pair.length == 2 ?
decodeURIComponent(pair[1].replace(/\+/g, ' ')) : true);
}
return params;
};
var query = unparam(querystr);
for(var i in queryParamsToRemove) {
delete query[queryParamsToRemove[i]];
}
以下是我在项目中经常使用的函数,它允许您获取关联数组中的所有GET参数:
function urlGet()
{
var t = location.search.substring(1).split('&');
var f = new Object();
for (var i = 0; i < t.length; i++)
{
var x = t[i].split('=');
f[x[0]] = x[1];
}
return f;
}
现在只需构建一个新的查询字符串
var query = '?';
for (var prop in parameters)
{
query += prop + '=' + parameters[prop] + '&';
};
query = query.substr(0, query.length - 1);
现在,将它添加到您的基本url,您就完成了 好的,找到了有效的方法
for (param in queryParamsToRemove) {
queryString = queryString.replace(new RegExp('&(' + queryParamsToRemove[param] + '=)+((\w)*(.)*)*&', 'g'), '&');
}
非常感谢你。但是它在行中抛出了一个错误:parameters.splice('destination',1);说:“对象#没有方法‘拼接’参数正在解析好的,顺便说一下,我已经编辑了我的答案,您必须对对象使用
delete
method。Splice仅用于数字数组。@Sebj它也不能以这种方式正确连接。您应该在键和值之间加入=
。非常感谢您的回答。有一件事-第一个短部分可以很好地移除关键点,但会将值保留在适当的位置。如果可以修改它,那么它也会删除这些值,并避免为这个相当简单的任务编写冗长的代码……:)如果你提到正则表达式,那么正如我说的,它不是最好的,只考虑字母的价值。。。您需要修改正则表达式以使其正确识别值(这可能是一项相当复杂的任务,除非您在网上找到一个现成的正则表达式)我的查询字符串是:formGeneratorNative.php?1=1&width=1920&height=979&device=table&isEmulator=false&deviceCategory=3&destination=lobbyWrapper.php&formName=Login,所以这些值实际上是单词。我不明白你为什么不被移除…它在这里起作用。(检查控制台),同时“formGeneratorNational.php?”部分不应该是查询字符串的一部分!虽然在这种情况下可能不相关,但是其他将其拆分为数组的方法将无法顺利使用它。再次感谢。但是如果你仔细看,它不起作用。输出为:formGeneratorNative.php?1=1&width=1920&height=979&device=tablet&isEmulator=false&deviceCategory=3lobbyWrapper.phpLogin和ass您可以看到,“lobbyWrapper.phpLogin”仍然存在……当要删除的参数位于查询字符串的末尾(或开头)时,这将不起作用。与您的示例一样,formName不会被删除。我将更新我的答案,检查它。它确实有效…:)X*也可以是空字符串。请参见此处,它不起作用:formName不会被删除,因为它是最后一个。如果它是第一个,也一样(这就是为什么不应该在查询字符串中使用文件名)。“目的地”后面的所有内容也都被删除了。这很奇怪。。。我从查询字符串中去掉了文件名,它对我来说很好。我看不出它在拉小提琴。不明白为什么。我再看一眼,我明白为什么它不应该工作了。因为我在“登录”之后没有“&”。。。所以我想我也会在url的末尾加上&1=1。