正则表达式帮助 - 匹配任何 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'
感谢您观看本文!
我正在尝试构建一些适用于 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'