読者です 読者をやめる 読者になる 読者になる

とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

(3キャリア)携帯絵文字抽出正規表現パターン

なんだかすごいタイトルだなw

今日絵文字の抽出ロジックを書く機会があったのですが、
思ったより探し物が見つからなかったので記述
間違っていたら教えてください。


■絵文字領域(docomo)

sjis:[\xF8\xF9][\x40-\x7E\x80-\xFC]
utf8:\xEE[\x98-\x9D][\x80-\xBF]

■絵文字領域(au)

sjis:[\xF3\xF4\xF6\xF7][\x40-\x7E\x80-\xFC]
utf8:(?:\xEE[\xB1-\xB3\xB5\xB6\xBD-\xBF]|\xEF[\x81-\x83])[\x80-\xBF]

■絵文字領域(softbank)

sjis:[\xF7\xF9\xFB][\x41-\x7E\x80-\x9B\xA1-\xFA]
utf8:\xEE[\x80\x81\x84\x85\x88\x89\x8C\x8D\x90\x91\x94][\x80-\xBF]


処理内容は一応内部コードがsjisでもutf8でも対応できるように作成しました。

その他必要だった処理の抜粋(サンプル)
■前提条件
・端末はdocomo
・内部エンコードはutf8

<?php
public function execute(){
    $text = '[太陽の絵文字]だよ';
    
    //sjis-winに変換
    $text = mb_convert_encoding($text, 'SJIS-WIN', 'UTF-8');
    
    //絵文字領域
    $emoji = '[\xF8\xF9][\x40-\x7E\x80-\xFC]';
    
    //絵文字を16進数に置換
    $text = preg_replace_callback("/$emoji/",array($this,'convertToHex'),$text);
    
    //おそらくこの時点で$textは「f89fだよ」となっているはず
    
    //例えば絵文字の設定ファイルを読み込んだとして(本当はもっといろいろ入るdocomoなら256個の絵文字分)
    $code = array(array('key'=>1,'alt'=>'晴れ','sjis'=>'f89f'));
    
    $converted = ''
    foreach($code as $value){
       //絵文字があったら
       if(stristr($text, $value['sjis'])){
           $converted = str_ireplace($value['sjis'],"[i=" . $value['key'] . "]",$text);
       }
    }
    
    //表示する為にutf8に戻す
    return mb_convert_encoding($converted, 'UTF-8', 'SJIS-WIN');
    }

     /**
      * 16進数に変換(コールバック用)
      *
      * @access  public
      */
     private static function convertToHex($matches){

         return bin2hex($matches[0]);
     }
?>

ものすごくはしょって書きましたが処理の流れはこんな感じっす。
ご指摘等ありましたらぜひ教えてくださいm(__)m

本来class内で処理を書いてるのでpreg_replace_callbackの引数がarray($this,'convertToHex')になってますが
そこはマニュアル見てください。

いや、マジ大変でしたこれはかなり限定的なサンプルですが、
これの応用で3キャリアsjis,utf-8の内部コードに対応できると思います。

これ以外に設定ファイルキャリア間の絵文字コンバートファイルを作成したりと地味な作業が結構あったりします

教えてくれた皆さんにも感謝です。