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?