正则表达式帮助 - 匹配列表中未列出的任何 URL 参数和值

Regex Help - Match any URL Parameter & Value not in List

本文关键字:任何 URL 参数 未列出 帮助 列表 正则表达式      更新时间:2023-09-26

感谢您查看此内容!

我正在尝试构建一些在 JavaScript 中工作的正则表达式,它将匹配所有 URL 参数及其不在我的预定义列表中的值。 例:

原始网址:

/folder/index.html?knownParamA=1234&unknownParamA=1234&knownParamB=1234&unknownParamB=1234

我的已知参数列表:

((knownParamA|knownParamB|knownParamC)=[^&]*&?)/gi

生成的(已清理(网址:

/folder/index.html?knownParamA=1234&unknownParam=1234

最终,我想捕获任何URL的清理版本,仅包含我需要的参数和值。 我的网站上有大量参数对我来说毫无意义,只会妨碍我。 我发现的一个解决方案需要回顾一下,但我认为JavaScript不支持这些。

非常感谢您的帮助!!

基于以下反馈的解决方案:

pageURL = window.location.pathname + window.location.search;
knownParams = 'knownParamA|knownParamB|knownParamC|knownParamD';
var urlCleanerRegexStep1 = new RegExp('[?&](?!(?:' + knownParams + ')(?==))[^=]+=[^&]*', 'gi');
var urlCleanerRegexStep2 = new RegExp('[?&]([^=]+=[^&]*)', '');
cleanPageURL = pageURL.replace(urlCleanerRegexStep1, "").replace(urlCleanerRegexStep2, '?$1');

否定搜索很棘手,需要零宽度的前瞻。

这将查找未知参数并将其从 URL 中删除:(更新 2:这不再保留以已知参数开头的未知参数。

step1 = url.replace(/[?&](?!(?:knownParamA|knownParamB)(?==))[^=]+=[^&]*/gi, '');
// "/folder/index.html?knownParamA=1234&knownParamB=1234"
但是,如果第一个参数

被去除,则第一个剩余参数前面将有一个&而不是?,您也需要替换它:

clean = step1.replace(/[?&]([^=]+=[^&]*)/, '?$1');
// "/folder/index.html?knownParamA=1234&knownParamB=1234"

当然,您可以将这些链接在一起:

clean = url.replace(/[?&](?!(?:knownParamA|knownParamB)(?==))[^=]+=[^&]*/gi, '').
  replace(/[?&]([^=]+=[^&]*)/, '?$1');

更新:我已经包含了user3842539的代码扩展,因为这里比在评论中更容易阅读。

pageURL = window.location.pathname + window.location.search;
knownParams = 'knownParamA|knownParamB|knownParamC|knownParamD';
var urlCleanerRegexStep1 = new RegExp('[?&](?!(?:' + knownParams + ')(?==))[^=]+=[^&]*', 'gi');
var urlCleanerRegexStep2 = new RegExp('[?&]([^=]+=[^&]*)', '');
cleanPageURL = pageURL.replace(urlCleanerRegexStep1, '').replace(urlCleanerRegexStep2, '?$1');

为了帮助您解释这些正则表达式,请执行以下操作:

  • [?&] = ?&
  • (......) = 捕获的组
  • (?!......) = 后跟此组的匹配项
  • (?:......) = 未捕获的组
  • (?=......) = 后跟该组的匹配项
  • = = =
  • [^=] = 除=以外的任何字符
  • + = 一次或多次
  • [^&] = 除&以外的任何字符
  • * = 零次或更多次

在正则表达式主体之外,

  • g标志表示"所有比赛"(而不是仅第一场比赛(
  • i标志表示"不区分大小写">
  • 在替换字符串中,$1表示"捕获的组 1">