Использование групп захвата в preg_replace () - PullRequest
2 голосов
/ 22 июня 2019

Мне трудно понять preg_replace ().
Это то, что я получил до сих пор. preg_replace($patter, $replacement, $string)
Но, это смущает меня, когда есть замена групп на замену. Но все же я получаю часть этого. Как ниже

preg_replace('/(\w+)/', 'hello', 'say hello!')
Я знаю, что это приведет к «привет, привет!». Я могу сделать что-то еще с захватом группы. preg_replace('/(\w+)/','\1 Hello', 'Say World!',1)

В результате появится «Say Hello World».

Это то, чего я не понимаю.

<?php
$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3';
echo preg_replace($pattern, $replacement, $string);
?>
Output:
April1,2003

Что ${1}1,$3 означает?

Какая разница между $1 \1 и <\1> Что это значит ${1}1? 1023 *

1 Ответ

2 голосов
/ 22 июня 2019

Отличный вопрос!

Для запасных частей

Я предполагаю, что <<code>\1> и $1 ${1} почти одинаковы, обращаясь к группам захвата, за исключением того, что у одной из них есть дополнительные <>.

Я думаю, что мы используем ${1}1, поскольку, если бы мы этого не сделали, у нас был бы $11, который просто не существует, поскольку у нас нет этих 11 групп захвата, у нас есть только 3 из них, похожая история для \11.

${1}1,$3 означает первую группу захвата ${1} и номер 1 и третью группу захвата $3.

Внутри регулярного выражения

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

Пожалуйста, посмотрите эту демонстрацию для обратной ссылки.

Ссылка

Именованные группы захвата и обратные ссылки

...