表情处理

This commit is contained in:
2025-12-05 16:26:50 +08:00
parent 1388124cc2
commit 3f002ac57b
3 changed files with 52 additions and 1 deletions

View File

@@ -98,6 +98,7 @@ class MessageController extends ApiController
}else {
$v['is_shop'] = 2; // 不是商家
}
$v['content'] = decodeEmojiFromDb($v['content']);
}
$mute = Db::name('chat_group_mute')->where(['group_id' => $group_id, 'user_id' => 0])->find();

View File

@@ -157,6 +157,54 @@ function param_sort($chatList, $param)
return $chatList;
}
/**
* 1. 判断字符串是否包含Emoji表情精准正则
* @param string $str 待检测字符串
* @return bool
*/
function hasEmoji($str) {
if (empty($str)) return false;
$emojiRegex = '/[\x{1F600}-\x{1F64F}\x{1F300}-\x{1F5FF}\x{1F680}-\x{1F6FF}\x{1F1E0}-\x{1F1FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{1F900}-\x{1F9FF}]/u';
return preg_match($emojiRegex, $str) > 0;
}
/**
* 2. 存储前处理含Emoji则Base64编码否则原样返回
* @param string $str 待入库字符串
* @return string 处理后的值Base64编码/原字符串)
*/
function encodeEmojiForDb($str) {
// 空值直接返回
if (empty($str)) return $str;
// 含表情则Base64编码否则返回原字符串
return hasEmoji($str) ? base64_encode($str) : $str;
}
/**
* 3. 提取后处理识别Base64编码的Emoji内容解码还原
* @param string $str 从数据库取出的字符串
* @return string 还原后的值(解码后/原字符串)
*/
function decodeEmojiFromDb($str) {
if (empty($str)) return $str;
// 步骤1判断是否为有效Base64strict模式验证
$decoded = base64_decode($str, true);
if ($decoded === false) {
// 不是有效Base64返回原字符串
return $str;
}
// 步骤2解码后验证是否含Emoji避免普通Base64字符串误解码
if (hasEmoji($decoded)) {
// 是含表情的Base64返回解码结果
return $decoded;
}
// 是有效Base64但不含表情返回原字符串避免误解码普通Base64内容
return $str;
}