使用preg_replace的正则表达式问题

时间:2011-02-13 21:26:49

标签: php regex preg-replace

我有这段代码:

$str = '(Test)';
$final = preg_replace('/\[translate=([a-z]{2})(.*)\]'.preg_quote($matches[3][$i]).'\[\/translate(.*)\]/',$str,$final,-1,$ct);

它可以处理这样的情况:

test0[translate=en]Hello![/translate]test1

出现如下:

test0(Test)test1

但在这种情况下:

[quote:3ggw49so][translate=en]Hello![/translate][/quote:3ggw49so]

它出现为:

[quote:3ggw49so](Test)

$ matches [3] [$ i]是“你好!”在这种情况下,$ str是“(Test)”,final是被覆盖的完整字符串。所以它删除了[/ quote:3ggw49so]部分,为什么会这样?

2 个答案:

答案 0 :(得分:2)

*贪心量词,这意味着它尽可能匹配。您的.*一直匹配到最后一个]。要使量词非贪婪,请附加问号:.*?

$final = preg_replace('/\[translate=([a-z]{2})(.*?)\]'.preg_quote($matches[3][$i]).'\[\/translate(.*?)\]/',$str,$final,-1,$ct);

答案 1 :(得分:1)

你可以使用非贪婪的开关或[^\]]*而不是.*来匹配“任何东西直到”。