全角英数字を半角に、半角カナを全角に簡単に変換 但しXSS脆弱性に注意
書籍等で使われているタイトルにある表記のゆらぎを減らすため、全角英数字を半角に、半角カナを全角に等、変換しようと思います。
preg_replaceを使って、正規表現で指定するものだと思っていました。
しかしちょっと(自分で書くのは面倒なため例示を探して)調べたところ、もっと簡単な方法をみつけました。
mb_convert_kanaを使う方法です。
方法というより当たり前の話なのですが、見落としていたのでテイクノートです。
mb_convert_kanaは、半角・全角を簡単に変換することのできる関数です。
「この関数は、日本語のみで使用可能です」とかmb_convert_kanaとありますが、「『半角』英数字を『全角』に変換」するオプションもあります。
<?php /* 「仮名」を全て「全角カタカナ」に変換します */ $str = mb_convert_kana($str, "KVC"); /* 「半角カタカナ」を「全角カタカナ」に変換し、「全角」英数字を「半角」 に変換します。 */ $str = mb_convert_kana($str, "KVa"); ?>
以上のように、変換する文字とオプションを順位指定します。
一度に複数のオプションが指定できるので便利ですね。
オプションの種類はマニュアルをご覧ください。
▽PHP: mb_convert_kana - Manual
http://jp2.php.net/manual/ja/function.mb-convert-kana.php
なお、以下の指摘もあるので注意。
mb_convert_kana()のaオプションがちょっと厄介で、英数字だけでなく、ASCII記号までも半角にされてしまうわけで、要は→>までもが>に変換されるという事態に
▽mb_convert_kana()のaオプションの脆弱性について(PAPALOG)
http://papalog.graffi.jp/notes/mb_convert_kana%E3%81%AEa%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
▽mb_convert_kana の a オプションで XSS 脆弱性(yuriko.net)
http://www.yuriko.net/arc/2009/01/17/mb_convert_kana-xss/
つまり、aオプションを使う場合で、かつ外部からの入力を処理する場合、注意が必要です。
私の場合、今のところ、xhtmlかrssで出力する関係で出力時にhtmlspecialcharsを通すから大丈夫だと思いますが、ついうっかり……を考えると使わない方が安全ですね。