如何使用preg_replace每次迭代替换一个重复的子字符串?



我有一个这样的字符串:

$replace = "I am a [[boy]], he is a[[boy]] too."

我想做的是将第一个[[boy]]替换为单词"Blank1",将第二个[[boy]]替换为"Blank2"。

我尝试过的:

for($i=1;$i<=count($questions[$qn_count]['correct_ans']);$i++){     
$word = "##BLK".$i."##";                
$pattern_bracket = "/[[([^]]+)]]/";            
$ff = preg_replace($pattern_bracket,$word , $replace, $i);          
}
$questions[$qn_count]['body'] = $ff;

上述[[ ]]将始终显示为##BLK2##的相同替换。 我可以替换两个括号会有不同的价值吗?

你的问题在细节上有点模糊,但我认为这是你正在寻找的一般方法:

代码:(演示(

$string="I am a [[boy]], he is a[[boy]] too.";
$swaps=['Blank1','Blank2'];
echo "$stringn";
foreach($swaps as $swap){
$string=preg_replace('/[{2}[^]]+]{2}/',$swap,$string,1);
echo "$stringn";
}

输出:

I am a [[boy]], he is a[[boy]] too.
I am a Blank1, he is a[[boy]] too.
I am a Blank1, he is aBlank2 too.

只是几个注意事项:

  • 您不需要转义否定字符类中的方括号。
  • 使用大括号限定符{2}将比重复字符等效项更有效地执行。
  • 由于您一次只想替换一个参数,因此请使用1作为preg_replace()的第四个参数而不是变量。

相关内容

最新更新