【问题标题】:javascript regex - remove a querystring variable if presentjavascript regex - 如果存在,则删除查询字符串变量
【发布时间】:2010-09-04 21:24:44
【问题描述】:

我需要使用 javascript 重写一个查询字符串。 首先,我检查变量是否存在,如果存在,我想用新的搜索词替换它。如果它不存在,那么我只需添加新变量

我可以让它使用简单的术语,比如 hat、ufc hat 空格是 %20,所以 ufc hat 真的是 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;

【问题讨论】:

  • 您也可以通过document.location.search 获取“查询字符串”。你可能想使用escape(term)

标签: javascript regex syntax query-string


【解决方案1】:

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

【讨论】:

  • 好主意...我认为这将使我对查询字符串有更多的控制权,谢谢
【解决方案2】:

location 对象已经具有非常好的属性,例如pathnamehostname 等,它们可以为您提供 URL 的各个部分。使用 .search 属性,而不是尝试将 URL 作为字符串破解(? 可能不仅仅出现在那个地方)。

然后是拆分& 字符(如果您想要更好的话,也可能是;,根据HTML4 B2.2)并根据您正在寻找的参数检查每个参数。对于一般情况,这需要正确的 URL 解码,因为g%62n_keywords=... 是拼写相同参数的有效方式。在自然退出的过程中,您需要再次编码,以阻止 & 继续下一个参数(以及包含其他无效字符)。

这里有几个实用函数可以用来更轻松地处理查询字符串操作。它们在 location.searchlink.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);

【讨论】:

    【解决方案3】:

    & 字符用于分隔查询字符串中的键值对。这样您就可以通过如下重写代码来匹配除 & 之外的所有字符:

    querystring=querystring.replace(/gbn_keywords=[^&]+/,"gbn_keywords="+term);
    

    [^&]+ 匹配直到 & 或字符串结尾的一个或多个字符。但如果查询字符串数据可能看起来像 ...?gbn_keywords= (no value) 的情况,则需要对上述行稍作修改:

    querystring=querystring.replace(/gbn_keywords=[^&]*/,"gbn_keywords="+term);
    

    只需将 + 更改为 * 以便正则表达式匹配 0 个或更多字符。我觉得这样更好。

    【讨论】:

      【解决方案4】:

      为什么不对url[1] 进行拆分,然后替换新数组中gbn_keywords 的值?

      如果您使用 JavaScript 框架,可能会有一个方便的函数来完成所有这些工作。在 Prototype 中有函数toQueryParams()

      【讨论】:

        猜你喜欢
        • 2012-10-15
        • 1970-01-01
        • 2014-01-20
        • 1970-01-01
        • 1970-01-01
        • 2020-05-15
        • 2013-01-17
        • 2015-08-07
        • 2011-07-28
        相关资源
        最近更新 更多