use preg_replace_all instead of preg_replace.  preg_replace stops after the first match.

PS:  php.net is your friend smile


edit: i guess that won't fix your issue (assuming the function gets called once for each post), but it will make multiple [dict] tags in the same post work.