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

如何从UTF8(mb4)字符串中彻底去除表情符号?求可靠方案

去除UTF-8字符串中表情符号的最优方案分析

现有两种方法的优缺点

方法一:指定Unicode码段匹配

function remove_emoji($string) {
    $symbols = "\x{1F100}-\x{1F1FF}" // Enclosed Alphanumeric Supplement
        ."\x{1F300}-\x{1F5FF}" // Miscellaneous Symbols and Pictographs
        ."\x{1F600}-\x{1F64F}" //Emoticons
        ."\x{1F680}-\x{1F6FF}" // Transport And Map Symbols
        ."\x{1F900}-\x{1F9FF}" // Supplemental Symbols and Pictographs
        ."\x{2600}-\x{26FF}" // Miscellaneous Symbols
        ."\x{2700}-\x{27BF}"; // Dingbats

    return preg_replace('/['. $symbols . ']+/u', '', $string);
}
  • 优点:仅针对已知表情码段删除,不会误删非表情字符。
  • 缺点:
    • 无法覆盖多码点组合表情(比如带肤色修饰的👨🏿、ZWJ连接的👨‍👩‍👧家庭组合);
    • Unicode表情库持续更新,新增表情码段需手动维护,长期易遗漏。

方法二:删除所有4字节UTF-8字符

function strip_mb4(string $str): string{
    $planes_1_3     = '\xF0[\x90-\xBF][\x80-\xBF]{2}';
    $planes_4_15    = '[\xF1-\xF3][\x80-\xBF]{3}';
    $plane_16       = '\xF4[\x80-\x8F][\x80-\xBF]{2}';
    
    return preg_replace("/(?:$planes_1_3|$planes_4_15|$plane_16)/", '', $str);
}
  • 优点:实现简单,能删除绝大多数4字节单个表情。
  • 缺点:
    • 误删所有4字节UTF-8字符,包括生僻汉字、古文字、特殊符号等非表情内容;
    • 同样无法处理多码点组合表情(部分组合码点为2/3字节)。

更优的实现方案

利用PHP PCRE的Unicode表情属性匹配(PHP 7.2+支持),直接匹配Unicode标准定义的所有表情符号,包括单个码点、修饰符、ZWJ组合序列,无需手动维护码段,覆盖范围最全面:

function remove_all_emojis(string $string): string {
    // 匹配所有Emoji相关字符:基础Emoji、修饰符、组件、扩展表情、ZWJ组合序列
    $emojiRegex = '/[\p{Emoji}\p{Emoji_Modifier}\p{Emoji_Component}\p{Emoji_Extended}\p{Emoji_ZWJ_Sequence}]/u';
    return preg_replace($emojiRegex, '', $string);
}

补充说明

  • 若PHP版本低于7.2,可使用第三方库辅助处理,或参考Unicode官方Emoji列表生成正则码段,但维护成本较高;
  • 如需精准控制(如保留特定表情),可在正则中排除对应码点或属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:01:09