如何从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
相关产品推荐
相关产品推荐

