Alla fine ho risolto così:

Codice PHP:
function replace($testo) {

$testo htmlentities($testoENT_QUOTES);
$testo str_replace("\n","
"
$testo);
$testo str_replace("[LINE]","<div id=\"d_line\"></div>"$testo); //linea
$testo str_replace("[B]","[b]"$testo);     
$testo str_replace("[/B]","[/b]"$testo);
$testo str_replace("[U]","<u>"$testo);     
$testo str_replace("[/U]","</u>"$testo);
$testo str_replace("[I]","[i]"$testo);     
$testo str_replace("[/I]","[/i]"$testo);
$testo str_replace("[TOP]""<a href=\"#top\"><img src=\"pics/top.jpg\" alt=\"back to top\" border=\"0\" align=\"right\"/></a>
"
$testo);
$testo str_replace("[L]""<a target=\"_blank\" href=\"http://"$testo); //inizio del link esterno
$testo str_replace("[IL]""<a href=\""$testo); //inizio del link interno
$testo str_replace("[H]""\">"$testo);//metà del link
$testo str_replace("[/L]""</a>"$testo); //chiusura del link
$testo str_replace("[M]""<a href=\"mailto:"$testo);//mailto

return $testo;
 } 
e richiamo la funzione con:

Codice PHP:
$text_area replace($text_area); 
dove text area è la variabile che contiene il testo inserito tramite form.

Magari a qualcuno torna utile questo script.