preg_replace函数的字符串withing定义定界符所有出现(preg_replace al

2019-09-29 06:30发布

我试图用“B”一些字符串内,以取代“ ”的所有事件。 问题是,我需要更换只有那些括号内信件:

ASD ASD ASD [ASD ASD ASD] ASD ASD ASD

现在我有这样的代码:

$what = '/(?<=\[)a(?=.*?\])/s';
$with = 'b';
$where = 'asd asd asd [asd asd asd] asd asd asd';

但是,只替换第一个“一”,而我得到这个结果:

ASD ASD ASD [BSD ASD ASD] ASD ASD ASD

我真的只需要一个了preg_replace调用做到了这一点。

Answer 1:

你不能用一个做到这一点preg_replace调用,因为回顾后需要说“有一个左方括号在比赛前的地方 ”,这是不可能的,因为回顾后发模式必须具有固定的长度。

为什么你绝对需要做的这一个电话呢? 它是可行的很容易与preg_replace_callback ,在那里你将匹配的方括号中的内容组,并使用preg_replace在比赛的每个时间(或只是一个简单的str_replace ,如果你要做的是将“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);


Answer 2:

试试这个(这究竟乔恩解释)

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


文章来源: preg_replace all occurrences in string withing defined delimeters