Probé tu código y me funcionó a la perfección.
comprueba que estén llegando bien los datos desde el $_POST imprimiendolo tal cual.
tal vez sea que el valor devuelto por BBCode() no lo estás almacenando, pues fijate bien que no estás trabajando con punteros por lo que tienes que recoger el valor devuelto por alguna variable para después imprimierlo.
Código:
function BBcode($texto){
$a = array(
"/\[i\](.*?)\[\/i\]/is",
"/\[b\](.*?)\[\/b\]/is",
"/\[u\](.*?)\[\/u\]/is"
);
$b = array(
"<i>$1</i>",
"<b>$1</b>",
"<u>$1</u>"
);
$texto = preg_replace($a, $b, $texto);
return $texto;
}
echo BBcode(nl2br("[ b]bbcode en negrita[/b]
[ i]bbcode en italica[/i]
[ u]bbcode subrallado[/u]"));
ese es el codigo con el que probé yo, (obviamente sin espacios, se los puse para que el foro no me transformara)