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

Javascript 正则表达式帮助-匹配任何URL参数&;值不在列表中,javascript,regex,google-analytics,url-parameters,universal-analytics,Javascript,Regex,Google Analytics,Url Parameters,Universal Analytics,谢谢你看这个 我正在尝试构建一些在JavaScript中工作的正则表达式,这些正则表达式将匹配所有URL参数及其不在预定义列表中的值。例如: 原始URL: /folder/index.html?knownParamA=1234&unknownParamA=1234&knownParamB=1234&unknownParamB=1234 我的已知参数列表: ((knownParamA|knownParamB|knownParamC)=[^&]*&?)/gi

谢谢你看这个

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

原始URL:

/folder/index.html?knownParamA=1234&unknownParamA=1234&knownParamB=1234&unknownParamB=1234
我的已知参数列表:

((knownParamA|knownParamB|knownParamC)=[^&]*&?)/gi
结果(已清理)URL:

最后,我希望捕获任何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');

负面搜索很棘手,需要零宽度的lookahead

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

但是,如果去掉第一个参数,则剩余的第一个参数前面将有一个
&
,而不是
,您也需要替换它:

clean = step1.replace(/[?&]([^=]+=[^&]*)/, '?$1');
// "/folder/index.html?knownParamA=1234&knownParamB=1234"
当然,您可以将这些链接在一起:

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

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

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');

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

  • [?&]
    =要么
    要么
    &
  • =捕获的组
  • (?!
    =后面不跟此组的匹配项
  • (?:
    =未捕获组
  • (?=
    =后跟此组的匹配项
  • =
    =
    =
  • [^=]
    =除
    =
  • +
    =一次或多次
  • [^&]
    =除
    &
  • *
    =零次或多次
在regex机构之外

  • g
    标志表示“所有匹配”(与仅第一个匹配相反)
  • i
    标志表示“不区分大小写”
  • 在替换字符串中,
    $1
    表示“捕获的组1”

哇,感谢您的快速响应!这看起来很棒,我现在正在测试第一个示例。希望我能在早上看到一些积极的结果。你能给我解释一下第二个(清洁=步骤1.更换…)吗?我不确定我是怎么理解这个问号的。第一个示例中是否添加了排除问号或在问号后开始展望的内容?老兄,这是一个看起来很疯狂的正则表达式第一个正则表达式与每个参数前面的
&
匹配,因为先行(
(?!
)需要一些先行的东西。我试着在
=
后面附加一个look,但是你是对的,Javascript不能做到这些。谢谢,PJSCopeland!我还能得到一份你想做的事吗?我可以尝试将其插入谷歌分析,看看会发生什么。值得一试。你们提供的都是现场的。谢谢我冒昧地让它看起来更友好一点,以供将来可能需要它的人使用。pageURL=window.location.pathname+window.location.search;knownParams='knownParamA | knownParamB | knownParamC | knownParamD';var urlCleanerRegexStep1=newregexp(“[?&](?!”+knownparms+)[^=]+=[^&]*”,“gi”);var urlCleanerRegexStep2=新的RegExp('[?&]([^=]+=[^&]*),'';cleanPageURL=pageURL.replace(urlCleanerRegexStep1,”).replace(urlCleanerRegexStep2,“?$1”);并且,仅供谷歌Anayltics用户参考:你不能在过滤器中使用Regex Lookaheads。如果你想使用它,那么在你的标签管理系统中使用JavaScript,或者直接放在网站上的GA代码中。
clean = url.replace(/[?&](?!(?:knownParamA|knownParamB)(?==))[^=]+=[^&]*/gi, '').
  replace(/[?&]([^=]+=[^&]*)/, '?$1');
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');