ora il problema è: in quel modo va bene se ci sono solo due caratteri da sostituire, ma se devo sostituire i vari tags?

$testo = str_replace("[ i ]", "", $row['testo']);
$testo = str_replace("[ /i ]", "
", $row['testo']);
$testo = str_replace("[ b ]", "", $row['testo']);
$testo = str_replace("[ /b ]", "
", $row['testo']);
//ecc.


prende sempre l'ultima occorrenza (in questo caso formatterà solo il grassetto).