Hallo Eddie.
Dein Problem scheint mir gar nicht so sehr bei der Ersetzung der Zeichenketten zu liegen... Falls dich das mehrfache Schreiben der Image-Tags tatsächlich *so sehr* stört, bastel dir doch eine Funktion, in die du eine Zahl reinsteckst und den entsprechenden Image-Tag als Ergebnis zurückbekommst. Dein Ersetzungsarray könnte dann so aussehen:
$replace = array(
':-)' => MakeTag(1),
':-(' => MakeTag(2)
);