follows Ответ на ваш вопрос следует, но, пожалуйста, обратите внимание, что в 2019 году вы, вероятно, не должны использовать этот код. Смотрите конец моего ответа для лучшего решения. 100
Regexper демонстрирует, чему будет соответствовать это регулярное выражение:
InНа английском языке вы можете прочитать это как:
- Один или несколько
?
или &
символов, за которыми следует - группа # 1: один или несколько символов, которые не
=
или &
, затем - и
=
, затем - группа № 2: ноль или более символов, которые не
&
Группа № 1 фиксирует имена параметров, а группа № 2 фиксирует их значения.
Что касается функции обратного вызова (function(a,key,value) { ...
), переданной в replace
, давайте спросим MDN:
Вы можете указать функцию в качестве второго параметра. В этом случае функция будет вызвана после того, как будет выполнено совпадение. Результат функции (возвращаемое значение) будет использоваться в качестве строки замены. … Обратите внимание, что функция будет вызываться несколько раз для замены каждого полного совпадения, если регулярное выражение в первом параметре является глобальным.
Аргументы функции следующие:
match
- соответствующая подстрока. p1, p2, ...
- n -ая строка, найденная группой захвата в скобках, при условиипервый аргумент replace()
был объектом RegExp
. - …
(Источник: MDN: String.prototype.replace
- указание функции в качестве параметра )
(остальные опущены, поскольку они не относятся к нашему вопросу).
Это говорит нам о том, что функция вызывается для каждого совпадения, т.е. каждая пара имя-значение параметра в строке, и что второй аргумент (p1
или key
в вашем коде) содержит строку, захваченную группой # 1, а третий аргумент (p2
/ value
) содержитстрока, захваченная группой # 2.
Код, который вы нашли, действительно использует replace
для егопобочный эффект: Это действительно простой способ перебрать все совпадения в строке.
Лучший способ
Как отмечено в сообщении в блоге, на которое вы ссылались, если выДля таргетинга на текущие браузеры вместо анализа строки запроса вручную следует использовать URLSearchParams , предназначенный именно для этой цели:
const query = '?foo=1&bar=2';
const searchParams = new URLSearchParams(query);
// Get a specific param
const foo = searchParams.get('foo');
console.log('got foo:', foo);
// Iterate over all params
searchParams.forEach((val, key) => console.log(key, 'is', val));
URLSearchParams работает в во всех современных браузерах , включая MS Edge ≥ 17 (но не IE). Также существуют полифилы для старых браузеров.