【问题标题】:Regex for removing part of URL param用于删除部分 URL 参数的正则表达式
【发布时间】:2018-02-10 20:29:39
【问题描述】:

我正在尝试使用正则表达式删除 url 中的特定参数。

//Here are the scenarios of what I want to remove in the url
'?pIds=123,2311' => ''
'?pIds=123,2311&deal=true'  => '?deals=true'
'?pIds=123' => ''
'?pIds=123&deals=true'  => '?deals=true'

'&pIds=123,2311' => ''
'&pIds=123,2311&deals=true' => '&deals=true'
'&pIds=123' => ''
'&pIds=123&deals=true' => '&deals=true'


const a = '?pIds=123,2311&deals=true';
a.replace(/&?pIds=\d+,?\d+/i, '');

是否可以为这些场景创建单个正则表达式?我怎样才能有条件地拥有?或者 & 如果 pIds 分别是第一个或中间参数?

【问题讨论】:

  • 我建议将查询字符串解析成一个不错的地图/字典结构,删除不需要的键,然后重新创建查询字符串。

标签: javascript regex url


【解决方案1】:

您可以在 Javascript 中使用此正则表达式进行搜索:

/[?&]pIds=[^&]*$|([?&])pIds=[^&]*&/

RegEx 拆分:

  • [?&]pIds=[^&]*$:匹配?&,后跟pIds=$ 确保这是查询字符串中的唯一参数。
  • |:或者
  • ([?&])pIds=[^&]*&:匹配?&,后跟pIds=,后跟&。这是查询字符串中多了一个参数的情况。

代码:

var arr=['?pIds=123,2311',
'?pIds=123,2311&deal=true',
'?pIds=123',
'?pIds=123&deals=true',
'&pIds=123,2311',
'&pIds=123,2311&deals=true',
'&pIds=123',
'&pIds=123&deals=true'];

var re = /[?&]pIds=[^&]*$|([?&])pIds=[^&]*&/;

for (i=0; i<arr.length; i++) {
  console.log(arr[i], ' => ', arr[i].replace(re, '$1'));
}

RegEx Demo

【讨论】:

  • 您的解决方案效果很好!您能解释一下替换匹配正则表达式的 '$1' 做什么吗?
  • 另外,为什么正则表达式的第一部分需要换行符 \n?
  • \n 在正则表达式中并不是真正需要的。它仅用于 regex101 演示,因为在单独的行中有多个输入。 $1 也代表第一个捕获组,即交替右侧的 ([?&amp;])
【解决方案2】:

识别您正在谈论的块的正则表达式如下所示:

((?<=\?)|\&)pIds=\d+(,\d+)?

第一部分是一个问号的“正向后视”,如果pIds 之前有一个问号,它将匹配,但它不会将问号作为匹配的一部分。 & 符号也可以,但它作为匹配的一部分包含在内,因此会被删除。

我还使可选逗号和数字的处理更加清晰。您总是有一个数字块 (\d+),后跟一个逗号和另一个数字块。

编辑:在我原来的帖子中,我忘记正确处理 & 符号。如果字符串以问号开头并且没有 & 号,则要删除问号。如果它以问号开头并以 & 符号结尾,则您希望删除末尾的 & 符号。如果它以 & 符号开头和结尾,则需要删除其中一个。如果它以 & 开头而不以 1 结尾,则需要删除开头的那个。结果稍微复杂一些,如下所示:

\?pIds=\d+(,\d+)?($|[^&])|(?<=\?)pIds=\d+(,\d+)?\&|\&pIds=\d+(,\d+)

第一种情况不处理末尾的 & 符号(($|[^&amp;]) 对应于行尾或没有 & 符号)。第二种情况以? 开头并以&amp; 结尾。第三种情况处理剩下的两种情况,开头有一个&amp;

【讨论】:

    【解决方案3】:

    有很多方法可以做到这一点。这是一个没有正则表达式的版本:

    let url1 = 'foo.bar?pIds=123,2311&deals=true&foo=bar';
    let parsedUrl;
    let queryParts;
    
    // Get the query string from the URL
    parsedUrl = url1.split('?');
    
    // Split the query string so we get each key value then filter so we dont get the pIds
    queryParts = parsedUrl[1].split('&').filter(q => q.indexOf('pIds') === -1);
    
    // set URL to the original hostname and a ? if we have a query still
    url1 = (queryParts.length > 0 ? '?' : '')
    
    // Join the query parts
    url1 += queryParts.join('&')
    
    console.log(url1);

    更多示例:

    let url2 = 'foo.bar?pIds=123,2311';
      parsedUrl = url2.split('?');
      queryParts = parsedUrl[1].split('&').filter(q => q.indexOf('pIds') === -1);
      url2 = parsedUrl[0] + (queryParts.length > 0 ? '?' : '')
      url2 += queryParts.join('&')
      console.log(url2);
    
      let url3 = 'foo.bar?foo=bar&pIds=123,2311';
      parsedUrl = url3.split('?');
      queryParts = parsedUrl[1].split('&').filter(q => q.indexOf('pIds') === -1);
      url3 = parsedUrl[0] + (queryParts.length > 0 ? '?' : '')
      url3 += queryParts.join('&')
      console.log(url3);

    【讨论】:

      猜你喜欢
      • 2016-07-23
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2016-10-15
      • 1970-01-01
      相关资源
      最近更新 更多