You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何过滤Unicode 9之后版本的Emoji?适配MySQL 8 utf8mb4_0900

解决方案:仅过滤Unicode 9之后新增的Emoji

要解决这个问题,核心是精准识别并移除Unicode 9.0(对应Emoji 5.0)之后新增的Emoji字符,同时保留Unicode 9及更早版本的Emoji。以下是具体实现方法:

一、明确需要过滤的Emoji码点范围

Unicode 9之后的Emoji主要对应Emoji 6.0及后续版本,其码点集中在以下区间:

  • U+1F980 至 U+1F9FF(Unicode 10+新增)
  • U+1FA70 至 U+1FAFF(Unicode 11+新增)
  • U+1FAB0 至 U+1FABF(Unicode 12+新增)
  • U+1FAC0 至 U+1FACF(Unicode 13+新增)
  • U+1FAD0 至 U+1FADF(Unicode 14+新增)
  • U+1FAE0 至 U+1FAEF(Unicode 15+新增)
  • U+1FAF0 至 U+1FAFF(Unicode 15+新增)

这些区间外的Emoji(比如😀 U+1F600、🤦 U+1F926等)都属于Unicode 9及更早版本,可正常保留。

二、PHP实现过滤逻辑

方法1:正则表达式替换(简洁高效)

利用PHP的Unicode正则支持,直接匹配并替换目标区间的字符:

function filterPostUnicode9Emojis(string $input): string {
    // 匹配Unicode 9之后的Emoji码点
    $newEmojiPattern = '/[\x{1F980}-\x{1F9FF}\x{1FA70}-\x{1FAFF}\x{1FAB0}-\x{1FABF}\x{1FAC0}-\x{1FACF}\x{1FAD0}-\x{1FADF}\x{1FAE0}-\x{1FAEF}\x{1FAF0}-\x{1FAFF}]/u';
    return preg_replace($newEmojiPattern, '', $input);
}
  • 必须添加u修饰符,确保正则解析Unicode字符而非字节。
  • 该方法适合大多数场景,执行效率较高。

方法2:逐个字符检查(精准可控)

如果需要更精细的控制(比如记录被过滤的字符),可以逐个遍历字符并检查码点:

function filterPostUnicode9Emojis(string $input): string {
    $filtered = '';
    $charCount = mb_strlen($input, 'UTF-8');
    
    for ($i = 0; $i < $charCount; $i++) {
        $char = mb_substr($input, $i, 1, 'UTF-8');
        $codePoint = mb_ord($char, 'UTF-8');
        
        // 判断是否属于Unicode 9之后的Emoji区间
        $isNewEmoji = match(true) {
            ($codePoint >= 0x1F980 && $codePoint <= 0x1F9FF) => true,
            ($codePoint >= 0x1FA70 && $codePoint <= 0x1FAFF) => true,
            ($codePoint >= 0x1FAB0 && $codePoint <= 0x1FABF) => true,
            ($codePoint >= 0x1FAC0 && $codePoint <= 0x1FACF) => true,
            ($codePoint >= 0x1FAD0 && $codePoint <= 0x1FADF) => true,
            ($codePoint >= 0x1FAE0 && $codePoint <= 0x1FAEF) => true,
            ($codePoint >= 0x1FAF0 && $codePoint <= 0x1FAFF) => true,
            default => false
        };
        
        if (!$isNewEmoji) {
            $filtered .= $char;
        }
    }
    
    return $filtered;
}

三、测试验证

调用函数测试效果:

$testInput = "Hello 😀 你好 🦆 测试 🦧";
echo filterPostUnicode9Emojis($testInput);
// 输出:Hello 😀 你好  测试

可以看到,Unicode 9的😀被保留,Unicode 10的🦆和🦧被过滤。

四、注意事项

  • 肤色修饰符(U+1F3FB至U+1F3FF)属于Unicode 8,无需过滤,它们会和旧Emoji正常组合使用。
  • ZWJ组合Emoji(比如👨‍👩‍👧)只要组成字符都是Unicode 9及更早版本,就可以正常保留,无需额外处理。

内容的提问来源于stack exchange,提问作者caitlin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:26:13