シンボルの置換

ニュースリリースを管理するシステムを作っていたのですが、®や©などを上付きにするために、
<span class="sup">&copy;</span>
などとクライアントに入力していただくのは少々難があります。そのために、
<input type="button" onClick='forms[0].text.value="<span class=\"sup\"">&copy;</span>'>
のようにボタンを実装してみたのですが、どうにもtextareaに入力される文章が多くてうざったいです。また、このようにして挿入した文章をSQLなどのデータベースに保存すると、magic_quote_gpcがONになっていた場合、'や"の前にバックスラッシュが挿入されてしまいます。それを除去するために、stripslashes()関数を使うのも面倒くさいですので、どうにかできないと考えてみました。
そこで、他の方々もやっていると思われますが、入力される文字を、
[symbol:COPY]
のように勝手に自分で定義し、後で
str_replace("[symbol:COPY]","<span class=\"sup\">&copy;</span>",$string);
のように置換してしまおう、という作戦に出ました。このようにすれば他にもシンボルを配列で定義し、
$symbols = array(
    "COPY" => "<span class=\"sup\">&copy;</span>",
    "REG" => "<span class=\"sup\">&reg;</span>",
    ...
)
while( list($key,$val) = each($symbols) ) {
    str_replace("[symbol:". $key ."]",$val,$string);
}
とまとめることもできます。

次に、リンクも同様に置換してしまおうと思い、
[link:題名:URL] => <a href="URL">題名</a>
と定義しました。そして変換時に正規表現を使おうと思い、初めはereg_replace()を使ってみました。しかしながらどんなにやってもエラーが出るため、調べてみると日本語用にmb_ereg_replace()があることを発見(知ってろよって感じですが…(汗))。preg_replace()もありますがmb_ereg_replace()の方が個人的に表記が簡単かと思い、こちらを使用しました。
mb_ereg_replace("\[link:(.*?):(.*?)\]", "<a href=\"\\2\">\\1</a>", $string);
これで万事解決ですが、もっといい方法とかありましたら教えてください。