Emo PHP携帯絵文字ライブラリ
Home > 絵文字の正規表現
絵文字の正規表現
各社絵文字の正規表現をまとめました。
一部自作なので間違えていたらご指摘ください。

キャリア別、文字コード別の絵文字の正規表現
// docomoの絵文字の正規表現
$emoji = '[\xF8\xF9][\x40-\x7E\x80-\xFC]'; // sjis
$emoji = '\xEE[\x98-\x9D][\x80-\xBF]'; // utf-8 自作正規表現、間違いある?

// EZwebの絵文字の正規表現
$emoji = '[\xF3\xF4\xF6\xF7][\x40-\x7E\x80-\xFC]'; // sjis
$emoji = '(?:\xEE[\xB1-\xB3\xB5\xB6\xBD-\xBF]|\xEF[\x81-\x83])[\x80-\xBF]'; // utf-8 自作正規表現、間違いある?
$emoji = '<img localsrc=[\"\']?[\d]+[\"\']?>'; // tag

// SoftBankの絵文字の正規表現
$emoji = '([\x1B][\x24][GEFOPQ])([\x21-\x7E]+)([\x0F]|$)'; // webコード // 古い機種の一部で最終行が絵文字の場合[\x0F]が無い場合がある
$emoji = '[\xF7\xF9\xFB][\x41-\x7E\x80-\x9B\xA1-\xFA]'; // sjis 自作正規表現、間違いある?
$emoji = '\xEE[\x80\x81\x84\x85\x88\x89\x8C\x8D\x90\x91\x94][\x80-\xBF]'; // utf-8
絵文字があるかないかの判定
上の正規表現を読み込んでから下のif文で判定。
if (preg_match("/(?:$emoji)/", $str)) {
return true;
}
絵文字文字列取得
上の正規表現を読み込んでから下のpreg_match_all文で取得。
if (preg_match_all("/(?:$emoji)/", $str, $matches)) {
print nl2br(print_r($matches[0],1));
}
絵文字削除
上の正規表現を読み込んでから下のpreg_replace文で削除。
$str = preg_replace("/(?:$emoji)/", "", $str);
sjisの正規表現時の+α
utf-8などは大丈夫ですが、sjisの場合のみ上記正規表現でのパターンマッチだけでは誤判定してしまいます。
原因は、1文字目の2バイトと2文字目の1バイトでマッチしてしまうためです。
各キャリアでの誤マッチは以下の通り。
(常用語の一例で他にも多数あります)

・docomo誤マッチ文字列
引数
88F89094
効果
8CF889CA
引用
88F89770
効率
8CF897A6
引く
88F882AD
有効だ
974C8CF882BE

・EZweb誤マッチ文字列
印刷
88F38DFC
空白
8BF39492
状態
8FF391D4
程度
92F69378

・SoftBank誤マッチ文字列
収益
8EFB8976
方法
95FB9640
需要
8EF99776
隅に
8BF782C9

防ぐには上記正規表現で処理する前に、このような感じで処理する必要があります。(あくまで一例)

・一文字単位に分割してマッチさせる
$arr = splitOneSJIS($str);
foreach ($arr as $value) {
if (preg_match_all("/(?:$emoji)/", $value, $matches)) {
print nl2br(print_r($matches[0],1));
}
}

/**
* 1文字単位に分割して取得(sjis)
*
* @param string $str
* @return array $matches[0]
*/
function splitOneSJIS($str)
{
$char = '/(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])/';
if (preg_match_all($char, $str, $matches)) {
return $matches[0];
}
}
ホームへ