Genial, lo he conseguido con lo siguiente;
Código PHP:
$subs = array(
'/\[PHP\](.+)\[\/PHP\]/e' => 'print_php_code (html_entity_decode ("\\1"))',
'/_(.+)_/Ui' => '<em>$1</em>'
);
$bb_text = preg_replace(array_keys($subs), array_values($subs), $pregunta->row['descripcion']);
echo $bb_text;
Peor me surje un problema más. Ahora el texto englobado en las etiquetas [ PHP ] me lo pone al principio del mensaje y el resto al final.
¿Como dejar que respete la posición que tenía en el mensaje?