我需要使用javascript重写一个querysting。 首先,我检查变量是否存在,如果是,我想用新的搜索词替换它。如果它不存在那么我只需添加新变量
我能够使用像hat,ufc hat这样的简单术语 空白是%20,所以ufc帽子真的是ufc%20hat
我遇到了化妆,帽子 - 棒球,咖啡和咖啡等问题。茶等。
对此有什么正确的正则表达式?
以下是我的代码,但不起作用。
var url = String(document.location).split('?');
querystring = url[1];
if(querystring.match(/gbn_keywords=/)!=null)
querystring=querystring.replace(/gbn_keywords=[a-zA-Z0-9%20.]+/,"gbn_keywords="+term);
else
querystring=querystring+"&gbn_keywords="+term;
答案 0 :(得分:1)
不需要正则表达式。要获取查询参数,请执行?
之后的所有操作。然后,将字符串拆分为&
以返回每个参数。再次按=
拆分以获取arg名称(=
的右侧)和值(=
的左侧)。迭代每个参数,用每个参数重建URL,不包括你不想要的那个。您不应该在此处遇到问题,因为如果要在参数中使用?
,&
和-
,则必须对其进行转义。你还说过要添加参数,如果它不存在,那么只需将变量设置为true,同时迭代每个参数,如果找到参数。如果您没有将它附加到您重建的查询字符串的末尾。
答案 1 :(得分:1)
location
个对象已经具有非常好的属性,例如pathname
,hostname
等,它们为您提供了URL的单独部分。使用.search
属性而不是尝试将网址破解为字符串(?
不仅可能出现在该位置)。
这是一个分裂&
字符的情况(也许;
如果你想要很好,根据HTML4 B2.2)并检查每个参数与你的那个寻找。对于一般情况,这需要正确的URL解码,因为g%62n_keywords=...
是拼写相同参数的有效方式。在出门的路上,你需要再次编码,停止&
继续下一个参数(以及包含其他无效字符)。
这里有一些实用程序函数可以用来更轻松地处理查询字符串操作。它们在?...
或location.search
中看到的link.search
字符串和查找Object
映射参数名称之间转换为值数组(因为form-url编码的查询可以有多个相同参数的实例)。
function queryToLookup(query) {
var lookup= {};
var params= query.slice(1).split(/[&;]/);
for (var i= 0; i<params.length; i++) {
var ix= params[i].indexOf('=');
if (ix!==-1) {
var name= decodeURIComponent(params[i].slice(0, ix));
var value= decodeURIComponent(params[i].slice(ix+1));
if (!(name in lookup))
lookup[name]= [];
lookup[name].push(value);
}
}
return lookup;
}
function lookupToQuery(lookup) {
var params= [];
for (var name in lookup)
for (var i= 0; i<lookup[name].length; i++)
params.push(encodeURIComponent(name)+'='+encodeURIComponent(lookup[name][i]));
return params.length===0? '' : '?'+params.join('&');
}
这使得用法简单如下:
var lookup= queryToLookup(location.search);
lookup['gbn_keywords']= ['coffee & tea'];
var query= lookupToQuery(lookup);
答案 2 :(得分:0)
为什么不在url[1]
上运行拆分而不是替换新数组中gbn_keywords
的值?
如果您使用JavaScript框架,可能会有一个方便的功能来完成所有这些。在Prototype中有函数toQueryParams()。
答案 3 :(得分:0)
&安培; character用于分隔查询字符串中的键和值对。这样你就可以匹配除&amp;之外的所有字符。通过重写代码如下:
querystring=querystring.replace(/gbn_keywords=[^&]+/,"gbn_keywords="+term);
[^&amp;] +匹配一个或多个字符,最多为&amp;或者字符串的结尾。但是,如果有可能出现查询字符串数据的情况......?gbn_keywords =(无值)则需要对上述行稍作修改:
querystring=querystring.replace(/gbn_keywords=[^&]*/,"gbn_keywords="+term);
只需将+更改为*即可使正则表达式匹配0个或更多字符。我认为这更好。