iモードの絵文字を検出する正規表現
Tweet
入力フォームから絵文字を入力された場合、
それをDB格納にする際や表示時に、文字化けすることがあります。
本記事では、PHPから絵文字を検出し、事前に入力エラーを出したり、
絵文字を除去したりする方法をご紹介します。
今回はまず、ドコモのiモード絵文字編です。
以下が絵文字を検出するサンプルです。
$in_string = $_POST['in']; // 入力された値 $sjis = '[\\x81-\\x9F\\xE0-\\xF7\\xFA-\\xFC][\\x40-\\x7E\\x80-\\xFC] |[\\x00-\\x7F]|[\\xA1-\\xDF]'; // 実際には1行で入力 $emoji = '[\\xF8\\xF9][\\x40-\\x7E\\x80-\\xFC]'; $pattern = "/\\G((?:$sjis)*)(?:($emoji))/"; if (preg_match($pattern, $in_string)) { echo '絵文字が含まれています'; } else { echo '絵文字は含まれていません'; }
$in_stringに判定したい文字列を入れてください。
$sjisがSJIS判定用の正規表現、$emojiが絵文字を表す正規表現です。
(表示の都合上、改行されていますが、実際は1行で入力することにご注意ください)
それらを組み合わせた、$patternが絵文字かどうかを判定する正規表現になります。
続いて絵文字除去のサンプルです。
$in_string = $_POST['in']; // 入力された値 $sjis = '[\\x81-\\x9F\\xE0-\\xF7\\xFA-\\xFC][\\x40-\\x7E\\x80-\\xFC] |[\\x00-\\x7F]|[\\xA1-\\xDF]'; // 実際には1行で入力 $emoji = '[\\xF8\\xF9][\\x40-\\x7E\\x80-\\xFC]'; $pattern = "/\\G((?:$sjis)*)(?:($emoji))/"; preg_match_all($pattern, $in_string, $arr); $search = $arr[2]; // $arr[2]に対象絵文字が格納される // 絵文字除去 $out_string = str_replace($search, array(), $in_string); // 出力 echo $out_string;
動作の確認は、先日ご紹介したi絵文字を使って、PCブラウザからも行うことができますが、Firefoxなどのブラウザでは、絵文字がエンティティ化されてしまうことがありますので注意しましょう。
なお、絵文字判定の正規表現は次のサイトを参考にさせていただきました。
素敵な情報をありがとうございます。
→ CGIぽん モバイルCGI研究(i-mode編) i-mode 絵文字の処理
今回のサンプルはPHPのものでしたが、上記サイトではPerlを例にして記事が書かれています。
Perl利用者の方は参考になるのではないでしょうか。
他キャリアの絵文字の扱いについては、また後日ご紹介したいと思います。
関連:
最近の記事