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

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

感谢您观看本文!

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

原始 URL:

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

我的已知参数列表:

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

结果(清理)URL:

/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, '?');

否定搜索很棘手,需要 零宽度先行搜索。

这将找到未知参数并将它们从 URL 中删除:(更新 2:这不会保留以已知参数开头的未知参数 。)

step1 = url.replace(/[?&](?!(?:knownParamA|knownParamB)(?==))[^=]+=[^&]*/gi, '');
// "/folder/index.html?knownParamA=1234&knownParamB=1234"

但是,如果 first 参数被删除,您的第一个剩余参数将以 & 而不是 ? 开头,并且您也需要更换它:

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

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

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

更新:我已经包含了 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, '?');

帮助您解释这些正则表达式:

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

在正则表达式主体之外,

  • g 标志表示 'all matches'(相对于第一个)
  • i标志表示'case-insensitive'
  • 在替换字符串中,表示'captured group 1'