Lieber Felix
Ich verwende für diese Fälle immer folgendes:
preg_match_all($regExp,$in,$matches,PREG_OFFSET_CAPTURE);
Da bekommst du in $matches ein wunderbares mehrdimensionales Array, das du dann nach Herzenslust bearbeiten kannst. Wichtig ist nur, das du jedes in $matches vorhandene Array durch array_reverse() schickst, sonst stimmen die Positionsangaben nicht mehr.
Das eigentliche ersetzen sieht dann so aus:
$in = substr_replace($in,$repl,$matches[$x][1],strlen($matches[$x][0]));
Hoffe geholfen zu haben
Heizer