我有这段代码:
$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]部分,为什么会这样?
答案 0 :(得分:2)
*
是贪心量词,这意味着它尽可能匹配。您的.*
一直匹配到最后一个]
。要使量词非贪婪,请附加问号:.*?
。
$final = preg_replace('/\[translate=([a-z]{2})(.*?)\]'.preg_quote($matches[3][$i]).'\[\/translate(.*?)\]/',$str,$final,-1,$ct);
答案 1 :(得分:1)
你可以使用非贪婪的开关或[^\]]*
而不是.*
来匹配“任何东西直到”。