TL;DR
- 可能なら UILabel の設定の BBCode をオフにする。
- NG ワードチェックしているなら、
[
,]
を NG ワードに加える。 -
[
,]
を(
,)
等の似た記号に置き換えて無害化する。 - 記号をエスケープする方法が用意されていないので、 BBCode を有効にしつつ
[b]
などと表示する簡単な方法はない。
はじめに
NGUIのUIInputで入力欄を作成した場合にBBCode付きで文字列を入力されてしまうと
その文字列を使用している場所で太字や斜体が適用されてしまう不具合に遭遇したため
それを防ぐために作成しました
【Unity】NGUIで使用可能なBBCodeを文字列から削除して返す拡張メソッド - コガネブログ
偶然見かけたんですが、この方法では防げないため、まとめました。
FateGO などのゲームで名前に色をつけたりできてしまう件 ような、「悪意のあるユーザが入力した文字列でも BBCode のタグを発動させずに UILabel に表示したい」という前提で話をすすめます。
NGUI は手元にあった Version 3.8.2 で検証しています。
タグを取り除くのは難しい。
【Unity】NGUIで使用可能なBBCodeを文字列から削除して返す拡張メソッド - コガネブログ では \[b\](.*)\[\/b\]
のような正規表現でタグを取り除いていますが、 NGUI では閉じタグがなくても発動するため、 "[b]b"
のような形で回避可能です。
また NGUI には NGUIText.StripSymbols
というメソッドが用意されていて、 BBCode が発動してタグが消えた後の実際に表示される文字列と同じものを手に入れられますが、これはタグが全部取り除かれたわけではありません。
例えば、 "[b[b]]b"
を渡せば "[b]b"
が返ってきて発動します。
タグを取り除くのは難しいですし、「ユーザには BBCode つきで入力してもらいたいけど表示する時はタグだけ取り除いて表示したい」という場面はまずないと思われるので、なるべくユーザが入力した文字列をそのまま表示する事を目指しましょう。
UILabel の設定の BBCode をオフにする。
ユーザの名前だけを表示するラベルのような、もともと BBCode を使わない場合はオフにするだけで十分です。
当然、 BBCode を含むシナリオに名前を埋め込みたいような場合は使えません。
エスケープする方法は用意されていない。
されていません。残念ですね。
ちなみに uGUI のリッチテキストでも用意されていないようです。残念ですね。
似た記号に置き換える。
ということで似た記号に置き換えます。
BBCode のタグは [
で始まるものだけなので、この記号だけ潰せば安全ですが、対応していないのはなんだか気持ち悪いので ]
も置き換えてしまいましょう。
public static class StringExtensions
{
public static string SanitizeBBCode( this string self )
{
return self.Replace("[", "(").Replace("]", ")");
}
}
簡単ですね。
まとめ
エスケープする方法が用意されていないのは残念ですね。