preg_replace在定义的分隔符中的字符串中出现的所有匹配项

时间:2013-08-26 13:26:21

标签: php regex preg-replace

我正在尝试在某些字符串中用“ 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调用来完成此操作。

2 个答案:

答案 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