Дак она какраз и работает, посмотри, она правильно выбрала текст и обработала его.
Я немного о другом говорил, когда про вложенность толковал.
А данную задачу, поскольку она простая и вполне может быть разбита на фрагменты легко, проще всего решить так (ну чтобы не обрабатывать строку в цикле или рекурсивно):
PHP код:
$bbcode = '[color=red][color=blue]aaa[/color]aaa[/color]';
$bbcode = preg_replace(array('/\[color=([#]?[A-z]*)\]/', '/\[\/color\]/'), array("<font color='\\1'>", "</font>"), $bbcode);