Что у меня есть:
"%g% (%r% %s%)"
Что я хочу:
"get(%g%) (get(%r%) get(%s%))"
Что я делаю
$zk = "%g% (%r% %s%)";
$pat = '/(%.*%)?/';
$er = 'get($1)';
echo preg_replace($pat, $er, $zk);
Что я получаю
get(%g% (%r% %s%)get())get()
Что я делаю не так?
Вам нужно использовать переопределенное регулярное выражение класса:
(%[^%]+%)
[^%]+
отрицательный класс char, который соответствует любому символу, но не %
. Таким образом, это не будет соответствовать двум блокам %%
.
ИЛИ не-жадное регулярное выражение:
(%.+?%)
Замените матч с помощью get(\1)
*
в данном случае) для того , чтобы быть не жадным. Просто вопросительный знак делает его необязательным.