Codice PHP:
$reg_expr "/(<\\/?\\w+\\s*[^>]*\\/?>)?([^<>]*)/is";
preg_match_all($reg_expr$string$linesPREG_SET_ORDER); 
In questo modo scomponi il testo in tag (aperture, chiusura o aperto-chiuso)+parte testuale.

Poi prendi il testo: $lines[$i][2] e ci fai quello che vuoi senza toccare i tag.
Poi alla fine ricomponi il tutto.
Quello che devi fare è molto simile a quest'altra funzione che serve ad altro, ma credimi, la procedura che ti serve è identica:
http://abidibo.otto.to.it/index.php?evt[blog-viewList]&id=17
non ho il tempo di scriverti per intero la funzione, comunque il concetto è il seguente:
- suddividi la stringa in tag+testo
es:


lalalalaboldlalala<img .../>ancora testo</p>
viene suddiviso in:


lalalala
bold
lalala
<img.../>ancora testo
</p>
- prendi solo i testi con $lines[$i][2] e ci fai quello che vuoi
es.
lalalala
bold
etc..
- ricomponi la stringa, per ogni $i
$final_text .= $lines[$i][1].functionModifyText($lines[$i][2]);

Lo so di non essere stato molto chiaro, ma è piu' semplice di queòl che sembra.
ciao!