2016-09-22 2 views
2

Есть ли способ в preg_replace() или preg_replace_callback(), чтобы заменить только одну обратную ссылку? Например, у меня есть это регулярное выражение: /(\.popup)([\s\.{])/ и эта строка .popup .popup-option. Обратные ссылки, которые будут сгенерированы, следующие: $0 = .popup\s, $1 = .popup, $2 = \s. Я хочу заменить только $1 другой строкой. Как мне это сделать?Регулярные выражения PHP - Замена одной обратной ссылки

Спасибо.

ответ

3

Вы можете использовать preg_replace_callback так:

$s = '.popup .popup-option'; // original string 

echo preg_replace_callback('/(\.popup)([\s\.{])/', function ($m) { 
    return 'foo' . $m[2]; }, $s); 
//=> foo .popup-option 

В обратном вызове мы возвращаем некоторую строку замены foo сцепляются с $m[2], таким образом, получая только $m[1] заменить.


Обратите внимание, что с помощью предпросмотр Вы можете сделать то же самое в preg_replace:

echo preg_replace('/\.popup(?=[\s\.{])/', 'foo', $s); 
//=> foo .popup-option 
+1

Единственный сценарий, я отсутствовал в том, что это может быть только '.popup', который не работает с этим регулярным выражением потому что я специально говорю, что за ним должно следовать пробел, точка или {. В любом случае, я немного изменил ваш ответ на '/ \. Popup ((? = [\ S \. {]) | \ Z) /' –

Смежные вопросы