0

我想使用preg_replace一个模式和一系列不同的替换。换句话说,对于每次出现的匹配,我都想向下迭代替换数组以进行替换。

有没有办法做到这一点?

我尝试使用preg_replace_callback- 回调接受一组匹配项,但必须只返回一个字符串 - 无法判断您要替换哪个匹配项。

我还尝试使用count参数并将其传递给回调函数 - 每次都是 0,并且在 preg_replace 完成之后,然后告诉匹配的总数。

4

3 回答 3

2

接受@Andreas 的回答并稍微改进一下性能:

$count = 1;
foreach ($replaceArray as $replace)
{
  preg_replace($pattern, $replace, $subject, 1, $count);

  if ($count == 0) 
    break;
}

这将检查是否已执行替换,如果不是这样(因为没有更多匹配项),则放弃循环。如果 中的元素$replaceArray多于 中的匹配项,这将节省性能$subject

于 2013-10-22T23:40:59.107 回答
1

尝试一些类似的东西:

foreach ($replaceArray as $replace)
{
    $subject = preg_replace($pattern, $replace, $subject, 1);
}

它将遍历您的替换数组,一次只替换 1 个。

于 2013-10-22T23:33:36.963 回答
0

如果您创建一个与替换数组大小相同的模式数组,则不需要迭代,例如:

$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);
于 2013-10-23T00:05:35.647 回答