javascript正则表达式 - 如果存在则删除查询字符串变量

时间:2010-09-04 21:24:45

标签: javascript regex syntax query-string

我需要使用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;

4 个答案:

答案 0 :(得分:1)

不需要正则表达式。要获取查询参数,请执行?之后的所有操作。然后,将字符串拆分为&以返回每个参数。再次按=拆分以获取arg名称(=的右侧)和值(=的左侧)。迭代每个参数,用每个参数重建URL,不包括你不想要的那个。您不应该在此处遇到问题,因为如果要在参数中使用?&-,则必须对其进行转义。你还说过要添加参数,如果它不存在,那么只需将变量设置为true,同时迭代每个参数,如果找到参数。如果您没有将它附加到您重建的查询字符串的末尾。

答案 1 :(得分:1)

location个对象已经具有非常好的属性,例如pathnamehostname等,它们为您提供了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个或更多字符。我认为这更好。