我想使用preg_replace
一个模式和一系列不同的替换。换句话说,对于每次出现的匹配,我都想向下迭代替换数组以进行替换。
有没有办法做到这一点?
我尝试使用preg_replace_callback
- 回调接受一组匹配项,但必须只返回一个字符串 - 无法判断您要替换哪个匹配项。
我还尝试使用count
参数并将其传递给回调函数 - 每次都是 0,并且在 preg_replace 完成之后,然后告诉匹配的总数。
接受@Andreas 的回答并稍微改进一下性能:
$count = 1;
foreach ($replaceArray as $replace)
{
preg_replace($pattern, $replace, $subject, 1, $count);
if ($count == 0)
break;
}
这将检查是否已执行替换,如果不是这样(因为没有更多匹配项),则放弃循环。如果 中的元素$replaceArray
多于 中的匹配项,这将节省性能$subject
。
尝试一些类似的东西:
foreach ($replaceArray as $replace)
{
$subject = preg_replace($pattern, $replace, $subject, 1);
}
它将遍历您的替换数组,一次只替换 1 个。
如果您创建一个与替换数组大小相同的模式数组,则不需要迭代,例如:
$string = 'obo oto oko';
$pattern = '~o.o~i';
$replacements = array('glip', 'glap', 'glop');
$patterns = array_fill(0, count($replacements), $pattern);
$result = preg_replace($patterns, $replacements, $string, 1);
print_r($result);