Я думаю, что это невозможно. Вы можете указать предел замен в необязательном четвертом параметре, но он всегда начинается с начала.
Можно достичь того, что вы ищете, с помощью preg_split()
. Вам просто нужно будет разбить вашу строку во всех случаях вашего шаблона поиска, а затем связываться с ними по одному. Если ваш шаблон поиска - просто строка, вы можете добиться того же с помощью explode()
. Если вам понадобится помощь в разработке этого подхода, я буду рад помочь.
РЕДАКТИРОВАТЬ : Давайте посмотрим, работает ли это для вас:
$subject = 'a b a';
$pattern = '/a/';
$replace = 1;
// We split the string up on all of its matches and obtain the matches, too
$parts = preg_split($pattern, $subject);
preg_match_all($pattern, $subject, $matches);
$numParts = count($parts);
$results = array();
for ($i = 1; $i < $numParts; $i++)
{
// We're modifying a copy of the parts every time
$partsCopy = $parts;
// First, replace one of the matches
$partsCopy[$i] = $replace.$partsCopy[$i];
// Prepend the matching string to those parts that are not supposed to be replaced yet
foreach ($partsCopy as $index => &$value)
{
if ($index != $i && $index != 0)
$value = $matches[0][$index - 1].$value;
}
// Bring it all back together now
$results[] = implode('', $partsCopy);
}
print_r($results);
Примечание: это еще не проверено. Пожалуйста, сообщите, работает ли он.
РЕДАКТИРОВАТЬ 2 :
Я протестировал его на вашем примере сейчас, исправил несколько вещей, и теперь он работает (по крайней мере, с этим примером).