preg_replace非贪婪不能像我期望的那样工作

时间:2015-03-24 13:18:36

标签: php regex

我有什么:

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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

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

(%[^%]+%)

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

或非贪婪的正则表达式:

(%.+?%)

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

DEMO