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];
}
}
ホームへ