Подтвердить что ты не робот

Что означает $1 $2 $4 в этом preg_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" в запасной части.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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