Lieber Horst,
$str=preg_replace('/<img*thumb.php5?image_id=(\d+)['|"]\s*/>/i', ...
Was willst Du mit diesem ^^^^ Sternchen?
Wenn Du schon sowohl einfache als auch doppelte Anführungszeichen berücksichtigen möchtest, dann solltest Du auch explizit darauf prüfen! Was bringt es denn, wenn sich Dein Suchmuster mit einfachen Anführungszeichen am Anfang des src-Attributs, und mit doppelten am Schluss zufrieden gibt?
Mein Vorschlag (ungetestet!):
Nimm zunächst einmal die Tilde als Delimiter, dann muss man bei Pfaden nicht jeden Slash escapen. Die Tilde kommt so selten vor, dass man sie so gut wie nie escapen muss, was die Leserlichkeit enorm erhöt.
Wenn Du auf Backreferences eingehen möchtest, dann nimmst Du nicht $1, $2 usw. wie in Javascript, sondern \1, \2 usw.
Wenn Du schon Backreferences einsetzt, dann verwende sie doch auch dazu, um sicherzustellen, dass die umschließenden Anführungszeichen vorne wie hinten vom selben Typ (einfach oder eben doppelt, aber nicht beides zusammen) sind.
Diese Überlegungen bringen mich zu folgendem Code, wobei die erste Klammer die Art der Anführungszeichen speichert, die zweite die ID Deines Thumbnails:
$str = '<img src="http://www.example.org/thumb.php?image_id=1234" alt="" />';
$replaced_str = preg_replace(
'~(?is)<img [^>]*src=(["\'])[^"\']+thumb.php5\?image_id=(\d+)(\\1)[^>]*>~',
'<a href="http://www.example.org/medium.php5?image_id=\\2"><img src="http://www.example.org/thumb.php5?image_id=\\2" alt="" /></a>',
$str);
Liebe Grüße aus Ellwangen,
Felix Riesterer.