如何在JavaScript中删除查询字符串参数?

2022-08-30 02:18:13

除了使用正则表达式之外,是否有更好的方法从标准 JavaScript 中的 URL 字符串中的查询字符串中删除参数?

以下是我到目前为止想出的似乎在我的测试中起作用的东西,但我不喜欢重新发明查询字符串解析!

function RemoveParameterFromUrl( url, parameter ) {

    if( typeof parameter == "undefined" || parameter == null || parameter == "" ) throw new Error( "parameter is required" );

    url = url.replace( new RegExp( "\\b" + parameter + "=[^&;]+[&;]?", "gi" ), "" ); "$1" );

    // remove any leftover crud
    url = url.replace( /[&;]$/, "" );

    return url;
}

答案 1
"[&;]?" + parameter + "=[^&;]+"

看起来很危险,因为它的参数“bar”会匹配:

?a=b&foobar=c

此外,如果包含 RegExp 中任何特殊的字符(如“.”),它将失败。它不是全局正则表达式,因此它只会删除参数的一个实例。parameter

我不会为此使用简单的正则表达式,我会解析参数并丢失您不想要的参数。

function removeURLParameter(url, parameter) {
    //prefer to use l.search if you have a location/link object
    var urlparts = url.split('?');   
    if (urlparts.length >= 2) {

        var prefix = encodeURIComponent(parameter) + '=';
        var pars = urlparts[1].split(/[&;]/g);

        //reverse iteration as may be destructive
        for (var i = pars.length; i-- > 0;) {    
            //idiom for string.startsWith
            if (pars[i].lastIndexOf(prefix, 0) !== -1) {  
                pars.splice(i, 1);
            }
        }

        return urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : '');
    }
    return url;
}

答案 2

现代浏览器提供URLSearchParams接口来处理搜索参数。它具有按名称删除参数的删除方法。

if (typeof URLSearchParams !== 'undefined') {
  const params = new URLSearchParams('param1=1&param2=2&param3=3')
  
  console.log(params.toString())
  
  params.delete('param2')
  
  console.log(params.toString())

} else {
  console.log(`Your browser ${navigator.appVersion} does not support URLSearchParams`)
}