Для ваших примеров данных это должно работать хорошо:
$s2 = preg_replace('~\[(#[0-9a-f]{6})\]([A-Z])~',
"<font color='$1'>$2</font>", $s);
Возможно, вы захотите изменить заполнитель [A-Z]
для ваших нужд.Это соответствует только одной заглавной букве, как в вашем примере.