preg_replace не жадный не работает, как я ожидал

0

Что у меня есть:

 "%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()

Что я делаю не так?

  • 2
    Вы жадный :).
  • 0
    Вы должны поместить знак вопроса после квантора ( * в данном случае) для того , чтобы быть не жадным. Просто вопросительный знак делает его необязательным.
Теги:

1 ответ

1
Лучший ответ

Вам нужно использовать переопределенное регулярное выражение класса:

(%[^%]+%)

[^%]+ отрицательный класс char, который соответствует любому символу, но не %. Таким образом, это не будет соответствовать двум блокам %%.

ИЛИ не-жадное регулярное выражение:

(%.+?%)

Замените матч с помощью get(\1)

DEMO

  • 0
    Я не понимаю, как это не жадно ...
  • 0
    добавил второй вариант ..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню