Что означает $ 1 $ 2 $ 4 в этом preg_replace?

Получил эту функцию для сглаживания строки запроса и задавался вопросом, что означало замещающая часть pre_replace (т. Е. $ 1 $ 2 $ 4).

function add_querystring_var($url, $key, $value) { $url = preg_replace('/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&'); $url = substr($url, 0, -1); if (strpos($url, '?') === false) { return ($url . '?' . $key . '=' . $value); } else { return ($url . '&' . $key . '=' . $value); } } 

Не слишком знакомы с материалами регулярных выражений. Я получаю различные части preg_replace, но не 100% об использовании «$ 1 $ 2 $ 4» в заменяемой части.

$1, $2... $n в выражениях регулярных выражений – это ссылки на совпадения, заключенные в круглые скобки. $0 будет полным совпадением, $1 будет первым скобленовым захватом, $2 будет вторым и т. Д.

  • $1 – это ссылка на то, что соответствует первому (.*)
  • $2 является ссылкой на (\?|&)
  • $4 – ссылка на вторую (.*)

См. Документы , в частности аргумент замены функции:

замена может содержать ссылки на форму \ n или (начиная с PHP 4.0.4) $ n, причем последняя форма является предпочтительной. Каждая такая ссылка будет заменена текстом, записанным в n-м скобках. n может быть от 0 до 99, а \ 0 или $ 0 относится к тексту, сопоставляемому всем шаблоном . Открывающиеся круглые скобки подсчитываются слева направо (начиная с 1), чтобы получить номер подматрицы захвата. Чтобы использовать обратную косую черту взамен, она должна быть удвоена («\\» строка PHP).

Замена регулярного выражения Perl использует переменные соответствия, которые являются частями внутри круглых скобок в регулярном выражении:

  $1 $2 $3 $4 '/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i' 

Итак, ссылаясь на $1 в заменяющей строке, мы заменим то, что было сопоставлено в первых круглых скобках. $0 будет ссылаться на всю строку соответствия.

Вы даже можете сопоставить скобковые подмножества внутри самого регулярного выражения, используя обратную косую черту вместо знака доллара. Например, если вы хотите заменить слова с двойным словом «или», или «и»:

 preg_replace('/\b(the|and)\b\s*\1/', '$1', $sentence); 

Держатели мест для каждой части регулярного выражения, заключенные в круглые скобки, заменяют часть, указанную в регулярном выражении.