/ Published in: Other
Expand |
Embed | Plain Text
$str = '[SJISバイナリ絵文字コードを含む文字列]'; // 文字コードを設定 mb_internal_encoding('SJIS'); mb_regex_encoding('SJIS'); // 正規表現を定義 $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, $str, $arr); // $arr[2]に対象絵文字が格納される // 絵文字を置換 $rep_arr = array(); foreach($arr[2] as $value) { $emoji_cd = unpack("C*", $value); $hex = dechex($emoji_cd[1]) . dechex($emoji_cd[2]); $dec = hexdec($hex); if (63647 <= $dec AND $dec <= 63740) { // 絵文字No.1 ~ No.94 $dec = $dec - 4705; } elseif (63872 <= $dec AND $dec <= 63996) { // 絵文字No.118 ~ No.166、拡1~拡76 $dec = $dec - 4773; } elseif ((63808 <= $dec AND $dec <= 63817) OR (63824 <= $dec AND $dec <= 63826) OR (63829 <= $dec AND $dec <= 63831) OR (63835 <= $dec AND $dec <= 63838) OR (63858 <= $dec AND $dec <= 63870)) { // 絵文字No.95 ~ No.117、No.167 ~ No.176 $dec = $dec - 4772; } else { continue; } $replacement = '&#' . strtoupper(dechex($dec)) . ';'; $str = mb_ereg_replace($value, $replacement, $str); } // 置換処理 $str = strtr($str, $rep_arr); // 出力 echo $str;
You need to login to post a comment.
