我正在尝试在某些字符串中用“ b ”替换所有出现的“ a ”。问题是我只需要替换括号内的那些字母:
asd asd [asd asd asd] asd asd asd
现在我有了这段代码:
$what = '/(?<=\[)a(?=.*?\])/s';
$with = 'b';
$where = 'asd asd asd [asd asd asd] asd asd asd';
但它只取代了第一个“a”,我得到了这个结果:
asd asd [bsd asd asd] asd asd
我真的需要只使用一个preg_replace调用来完成此操作。
答案 0 :(得分:2)
你不能通过一次preg_replace
调用来做到这一点,因为看起来需要说“在比赛前有一个开放的方括号某处”,这是不可能的,因为看后面的模式必须有固定的长度。
为什么你绝对需要在一个电话中执行此操作?使用preg_replace_callback
可以轻松实现,您可以在方括号内匹配内容组,每次匹配时使用preg_replace
(或者只是一个简单的str_replace
,如果你要去的话do是将“a”替换为“b”)。
示例:
$what = '/\[([^]]*)\]/';
$where = 'asd asd asd [asd asd asd] asd asd asd';
echo preg_replace_callback(
$what,
function($match) {
return '['.str_replace('a', 'b', $match[1]).']';
},
$where);
答案 1 :(得分:2)
试试这个(这正是Jon解释的)
function replace_a_with_b($matches)
{
return str_replace("a", "b", $matches[0]);
}
$text = 'asd asd asd [asd asd asd] asd asd asd';
echo preg_replace_callback("#(\[[^]]+\])#", "replace_a_with_b", $text);
输出:
asd asd asd [bsd bsd bsd] asd asd asd