Что означает $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" в запасной части.
Ответы
Ответ 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.