preg_replace非贪婪不会像我预期的那样工作


preg_replace non-greedy does not work as I would expect

我有什么:

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

我做错了什么?

您需要使用一个基于类的否定正则表达式:

(%[^%]+%)

[^%]+否定了与任何字符匹配但不与%匹配的字符类。所以这与两个%%块不匹配。

或非贪婪正则表达式:

(%.+?%)

将匹配项替换为get('1)

演示