【问题标题】:how to remove parameters from url query?如何从 url 查询中删除参数?
【发布时间】:2014-04-09 09:19:04
【问题描述】:

我正在尝试从 url 查询字符串中删除一些参数。

我有一个要删除的参数数组:

var queryParamsToRemove = ['destination','formName'];

我试图做的是搜索 url 中的每个参数,然后使用 RegExp 将其删除。像这样的:

for (param in queryParamsToRemove){
     patt = new RegExp(param,'g');
     queryString = queryString.replace('&' + patt + '=' + /*?=&/g,'');
}

但这不起作用,我猜是因为语法问题。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    这是我在项目中经常使用的一个函数,它允许您获取关联数组中的所有 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;
    }
    

    您可以使用此函数获取所有参数,然后使用delete 方法从数组中删除您不想要的参数。

    var parameters = urlGet();
    delete parameters.destination;
    delete parameters.formName;
    

    您现在只需构建一个新的查询字符串。

    var query = '?';
    
    for (var prop in parameters) 
    {
        query += prop + '=' + parameters[prop] + '&';
    };
    
    query = query.substr(0, query.length - 1);
    

    现在,将其添加到您的基本 url,就完成了!

    【讨论】:

    • 非常感谢。但它会在该行中引发错误:parameters.splice('destination', 1);说:“Object# 没有方法 'splice' 正在解析参数,顺便说一句
    • 我已经编辑了我的答案,您必须对对象使用delete 方法。 Splice 仅适用于数值数组。
    • @Sebj 这样也不会正确加入。您应该在键和值之间使用= 加入它。
    【解决方案2】:

    回答你真正的问题:

    for (param in queryParamsToRemove){
        queryString = queryString.replace(new RegExp('[&\?]' + queryParamsToRemove[param] + '=.*(&?)', 'g'), '\1');
    }
    

    应该可以的。

    否则你可以使用这样的函数:The $.param( ) inverse function in JavaScript / jQuery(只需从函数名中删除jQuery,你就可以在没有任何库的情况下使用它)。

    类似这样的:

    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]];
    }
    

    将查询字符串转换为数组,然后您可以从那里删除您的值并将其转换回查询字符串。如果你使用 jQuery,你可以使用jQuery.param()

    否则制作自己的函数应该不会太难。

    现在我们可以将查询数组转换为字符串:

    reparam = function (queryArray) {
        var res = [];
    
        for(var i in queryArray) {
            res.push(i + "=" + queryArray[i]);   
        }
    
        return res.join('&');
    }
    
    var queryString = reparam(query);
    

    【讨论】:

    • 非常感谢您的回答。有一件事 - 第一个简短的部分很好地删除了键,但保留了值。如果可以对其进行修改,那么它也会删除这些值,并避免为这个相当简单的任务编写冗长的代码...... :)
    • 如果您谈到正则表达式,那么正如我所说,它不是最好的,只考虑字母作为值...您需要修改正则表达式以使其正确识别值(这可能是一个相当复杂的任务,除非你在网上找到一个现成的正则表达式)
    • 我的查询字符串是:formGeneratorNative.php?1=1&width=1920&height=979&device=tablet&isEmulator=false&deviceCategory=3&destination=lobbyWrapper.php&formName=Login 所以这些值确实是单词。我不明白为什么没有被删除...
    • 它在这里工作。 jsfiddle.net/d9K7L(检查控制台),也是“formGeneratorNative.php?”部分不应该是查询字符串的一部分!虽然在这种情况下它可能不相关,但是将其拆分为数组的其他方法无法顺利使用。
    • 再次感谢您。但如果你仔细观察,它不起作用。输出是:formGeneratorNative.php?1=1&width=1920&height=979&device=tablet&isEmulator=false‌​&deviceCategory=3lobbyWrapper.phpLogin,你可以看到,“lobbyWrapper.phpLogin”仍然存在......
    【解决方案3】:

    好的,找到了可行的方法!

    for (param in queryParamsToRemove) {
        queryString = queryString.replace(new RegExp('&(' + queryParamsToRemove[param] + '=)+((\w)*(.)*)*&', 'g'), '&');
    }
    

    【讨论】:

    • 当要删除的参数位于查询字符串的末尾(或开头)时,这将不起作用。与您的示例一样,不会删除 formName 。我会更新我的答案,检查一下。
    • 它确实有效... :) X* 也可以是一个空字符串
    • 看这里,它不起作用:jsfiddle.net/d9K7L/2 formName 不会被删除,因为它是最后一个。此外,如果它是第一个,则相同(这就是为什么您不应该在查询字符串中使用文件名的原因)。此外,“destination”之后的所有内容也会被删除。
    • 这很奇怪......我从查询字符串中取出文件名,它对我来说很好用。我可以看到它在小提琴中不起作用。看不出为什么。我再看一遍
    • 嗬,我明白为什么它不应该工作了。因为我在“登录”之后没有“&”......所以我想我会在网址的结尾也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2012-01-31
    • 2017-11-22
    • 2019-04-25
    • 2018-01-16
    • 2012-01-23
    相关资源
    最近更新 更多