Мне кажется, что preg_replace_callback
- самое прямое решение.Вы просто указываете альтернативные шаблоны с помощью операторов |
, а внутри обратного вызова вы кодируете if
или switch
.Кажется, правильный путь для меня.Почему вы его выбросили?
Альтернативное решение - сделать временную замену специальной строке.Скажем:
// first pass
$subject = preg_replace($pat0, 'XXX_MYPATTERN0_ZZZ', $subject);
$subject = preg_replace($pat1, 'XXX_MYPATTERN1_ZZZ', $subject);
$subject = preg_replace($pat2, 'XXX_MYPATTERN2_ZZZ', $subject);
// second pass
$subject = preg_replace("XXX_MYPATTERN0_ZZZ",$rep0 , $subject);
$subject = preg_replace("XXX_MYPATTERN1_ZZZ",$rep1 , $subject);
$subject = preg_replace("XXX_MYPATTERN2_ZZZ",$rep2 , $subject);
Это очень уродливо, плохо адаптируется к динамическим заменам и не защищено от ошибок, но для некоторых сценариев "выполнить один раз" это может быть приемлемо.