Соответствие php preg_replace

Как получить доступ к совпадениям в preg_replace в качестве полезной переменной? Вот мой пример кода:

<?php $body = <<<EOT Thank you for registering at <!-- site_name --> Your username is: <!-- user_name --> <!-- signature --> EOT; $value['site_name'] = "www.thiswebsite.com"; $value['user_name'] = "user_123"; $value['signature'] = <<<EOT live long and prosper EOT; //echo preg_replace("/<!-- (#?\w+) -->/i", "[$1]", $body); echo preg_replace("/<!-- (#?\w+) -->/i", $value[$1], $body); ?> 

Я продолжаю получать следующее сообщение об ошибке:

Ошибка анализа: синтаксическая ошибка, неожиданный «$», ожидающий T_STRING или T_VARIABLE в строке 18

Вышеупомянутая строка с надписью «[$ i]» отлично работает, когда переменная соответствия заключена в кавычки. Есть немного синтаксиса, который я пропускаю?

Например: echo preg_replace("/<!-- (#?\w+) -->/", '$1', $body);

Между прочим, модификатор /i может нанести вред только шаблону, без буквенных букв.

Вы не можете использовать preg_replace таким образом. Он не определяет переменную с именем $1 которой вы можете взаимодействовать без внешней замены; строка '$1' просто используется внутри для представления первого подвыражения шаблона.

Вам нужно будет использовать preg_match чтобы найти строку, сопоставляемую (#?\w+) , за которой следует preg_replace чтобы заменить строку с соответствующим $value :

 $value['site_name'] = "www.thiswebsite.com"; $value['user_name'] = "user_123"; $value['signature'] = "something else"; $matches = array(); $pattern = "/<!-- (#?\w+) -->/i"; if (preg_match($pattern, $body, $matches)) { if (array_key_exists($matches[1], $value)) { $body = preg_replace($pattern, '<!-- ' . $value[$matches[1]] . ' -->', $body); } } echo $body;