PHP中如何用字符串数组替换文本中重复的{{bar}}占位符?
解决preg_replace替换{{bar}}为数组元素的问题
嘿,我懂你遇到的问题了——你想把文本里的{{bar}}标记依次替换成数组$bar里的对应值,但直接用preg_replace传数组完全没达到预期效果对吧?这是因为preg_replace的参数逻辑和你想的不一样:当你给替换参数传数组时,它是让每个正则表达式对应一个替换值,而不是循环用数组元素替换同一个正则的多次匹配。
下面给你两种可行的解决方法:
方法1:使用preg_replace_callback(推荐,灵活可控)
这种方法通过回调函数,每次匹配到{{bar}}时就从数组里取下一个元素,完美实现依次替换的需求:
$text = 'foo {{bar}} foo {{bar}} foo'; $bar = ['lol', 'kek']; $counter = 0; // 用来跟踪当前替换到数组的第几个元素 $result = preg_replace_callback('/{{bar}}/usi', function($matches) use (&$counter, $bar) { // 取模操作是可选的,如果匹配次数超过数组长度,会循环从头开始替换 return $bar[$counter++ % count($bar)]; }, $text); echo $result; // 输出:foo lol foo kek foo
为什么这个能行?
preg_replace_callback会为每一次匹配到的{{bar}}调用回调函数,我们用引用传递的$counter来记录当前替换的位置,每次调用就返回数组里对应下标的值,刚好实现依次替换的效果。
方法2:先构造对应长度的替换数组
如果你确定数组长度和文本里{{bar}}的匹配次数完全一致,也可以先获取匹配次数,再截取对应长度的数组作为替换参数:
$text = 'foo {{bar}} foo {{bar}} foo'; $bar = ['lol', 'kek']; // 先获取所有匹配的{{bar}}数量 preg_match_all('/{{bar}}/usi', $text, $matches); // 从$bar里截取和匹配次数一致的元素作为替换数组 $replacements = array_slice($bar, 0, count($matches[0])); $result = preg_replace('/{{bar}}/usi', $replacements, $text); echo $result; // 同样输出:foo lol foo kek foo
为什么原来的代码不行?
你之前写的preg_replace("/{{bar}}/usi",$bar,$text),因为只有一个正则表达式,preg_replace只会用数组的第一个元素替换所有匹配项,最终结果会是foo lol foo lol foo,而不是你想要的依次替换。
内容的提问来源于stack exchange,提问作者aki123
相关产品推荐
相关产品推荐

