tu usi htmlspecialchars quindi è normalissimo

ti conviene piuttosto fare un'altra cosa ... con un str_replace sostituisci tutti gli <a href=....> </a> in testo e poi lo riconverti in html

non hai altri modi

altrimenti puoi fare quello che fai per adesso con i br

$testo = preg_replace("/&lt;a(.*?)href=(.*?)&gt;(.*?)&lt;\/a&gt;/","<a$1href=$2></a>$3</a>", $testo);


mentre le br puoi trasformarle in
$testo = preg_replace("/&lt;br ?\/?&gt;/","
",$testo);

in questo modo prende
poi
poi ancora <br/ >e per finire
e li converte TUTTI in
cosa che puoi fare tranquillamente

PS: quando usi le espressioni regolari usa le PREG perché sono infinitamente più veloci e leggere rispetto alle ereg ^^