- 絵文字の正規表現
-
各社絵文字の正規表現をまとめました。
一部自作なので間違えていたらご指摘ください。
- キャリア別、文字コード別の絵文字の正規表現
-
// 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誤マッチ文字列
・EZweb誤マッチ文字列
・SoftBank誤マッチ文字列
防ぐには上記正規表現で処理する前に、このような感じで処理する必要があります。(あくまで一例)
・一文字単位に分割してマッチさせる
$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];
}
}