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

IT技术 javascript query-string
2021-01-19 00:15:36

除了使用正则表达式之外,是否有更好的方法从标准 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;
}
6个回答
"[&;]?" + parameter + "=[^&;]+"

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

?a=b&foobar=c

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

我不会为此使用简单的 RegExp,我会解析参数并丢失您不想要的参数。

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;
}
关于与 foobar 匹配的酒吧的好处。我已经更新了我原来的正则表达式,需要一个 ? 或 [&;] 开头。还要阅读您的解决方案以考虑它...
2021-03-16 00:15:36
轻度改进,以便在删除最终 URL 参数时,'?' 也被删除:将行更改url= urlparts[0]+'?'+pars.join('&');url= urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : "");
2021-03-20 00:15:36
如果你想摆脱“?” 移除后没有参数时,添加if条件来测试pars.length==0是否为0,如果为0,则制作“url = urlparts[0]”而不是附加“?”。
2021-03-26 00:15:36
@ktutnik/@JonasAxelsson URL 查询参数自然不区分大小写。
2021-03-31 00:15:36
将 URL 片段与 encodeURIComponent(parameter) 进行比较是否安全?如果 URL 对参数名称进行不同编码会怎样?例如“two%20words”与“two+words”。为了解决这个问题,最好解码参数名称并将其作为普通字符串进行比较。
2021-04-11 00:15:36

现代浏览器提供URLSearchParams了使用搜索参数的界面。其中具有delete按名称删除参数的方法。

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`)
}

请注意,URLSearchParamsIE、Edge 16 和 iOS 10.2 Safari 不支持。(参考:caniuse.com/#feat=urlsearchparams
2021-03-19 00:15:36
@khiavreoy 是的。就像答案中的前两个词给出相同的链接:)
2021-04-11 00:15:36

您可以通过以下方式更改 URL:

window.history.pushState({}, document.title, window.location.pathname);

这样,您可以在没有搜索参数的情况下覆盖 URL,我在获取 GET 参数后使用它来清理 URL。

如果只需要删除一个搜索参数而不更改其他搜索参数怎么办?谢谢!
2021-03-25 00:15:36
正是我所需要的。谢谢你。
2021-03-28 00:15:36

我没有看到正则表达式解决方案的主要问题。但是,不要忘记保留片段标识符(在 之后的文本#)。

这是我的解决方案:

function RemoveParameterFromUrl(url, parameter) {
  return url
    .replace(new RegExp('[?&]' + parameter + '=[^&#]*(#.*)?$'), '$1')
    .replace(new RegExp('([?&])' + parameter + '=[^&]*&'), '$1');
}

对于 bobince 的观点,是的 - 您需要对.参数名称中的字符进行转义

这行不通斯蒂芬·M·哈里斯。尝试给你的代码一个空字符串作为参数,看看会发生什么......
2021-04-09 00:15:36
这是一个改进的正则表达式,当参数没有值(即“ex.com?removeMe”)时有效,并且不会替换片段中的参数(即“ex.com?#&dont=removeMe”)或路径(即“ ex.com/&dont=removeMe'): url.replace(new RegExp('^([^#]*\?)(([^#]*)&)?' + parameter + '(\=[^&#]*)?(&|#|$)' ), '$1$3$5').replace(/^([^#]*)((\?)&|\?(#|$))/,'$1$3$4')
2021-04-11 00:15:36

复制自 bobince 的答案,但使其支持查询字符串中的问号,例如

http://www.google.com/search?q=test???+something&aq=f

一个 URL 中有多个问号是否有效?

function removeUrlParameter(url, parameter) {
  var urlParts = url.split('?');

  if (urlParts.length >= 2) {
    // Get first part, and remove from array
    var urlBase = urlParts.shift();

    // Join it back up
    var queryString = urlParts.join('?');

    var prefix = encodeURIComponent(parameter) + '=';
    var parts = queryString.split(/[&;]/g);

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

    url = urlBase + '?' + parts.join('&');
  }

  return url;
}
@Konamiman 这会更改参数数据,例如从以下位置删除“aq”:google.com/search? q=test???&aq=f但我明白你的意思,即使? 不会造成任何伤害。逻辑只需要确保最后?也是第一个?。
2021-03-14 00:15:36
您可能希望将最后一行替换return url.endsWith("?") ? url.slice(0,-1) : url;为覆盖要删除的参数是查询字符串中唯一一个的情况
2021-03-15 00:15:36
我并不是说它们在现实世界中不存在,人们可能希望能够处理它们,但在格式正确的 URL 中,问号是一个“保留字符”,除此之外的任何问号引入查询参数应该是 URL 编码的。
2021-03-17 00:15:36
我相信这???是无效的语法,永远不应该出现在 URL` 中。
2021-03-26 00:15:36
@torazaburo 看看我发布的 stackoverflow 问题:“URL 中有多个问号是否有效?”,答案似乎是肯定的。这也是几年前的事了,所以我不记得细节了,但是当没有正确处理时我遇到了问题。
2021-04-09 00:15:36