Что означает $ 1 $ 2 $ 4 в этом preg_replace? - PullRequest
15 голосов
/ 22 мая 2010

Получил эту функцию для исправления строки запроса и интересовался, что означала замещающая часть 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' в заменяющей части.

Ответы [ 3 ]

22 голосов
/ 22 мая 2010

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

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

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

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

6 голосов
/ 22 мая 2010

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

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

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

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

preg_replace('/\b(the|and)\b\s*\1/', '$1', $sentence);
2 голосов
/ 22 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...