如何使用PHP将字符串中的emoji替换为对应[emoji]格式BBCode
完全可以实现,你只需要把原来的preg_replace换成preg_replace_callback,在回调函数中把匹配到的emoji字符转换为对应的十六进制Unicode编码再拼接BBCode即可,可直接使用如下代码:
$data['message'] = preg_replace_callback( // 直接复用你原有验证有效的匹配正则,无需修改 "/([0-9|#][\x{20E3}])|[\x{00ae}|\x{00a9}|\x{203C}|\x{2047}|\x{2048}|\x{2049}|\x{3030}|\x{303D}|\x{2139}|\x{2122}|\x{3297}|\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?/u", function ($matches) { $emoji = $matches[0]; // 过滤变体选择符,避免影响编码获取 $emoji = preg_replace("/[\x{FE00}-\x{FEFF}]/u", "", $emoji); // 转为小写十六进制Unicode编码 $code = dechex(mb_ord($emoji, 'UTF-8')); return "[emoji]{$code}[/emoji]"; }, $data['message'] );
注意事项
- 代码中使用的
mb_ord函数需要PHP 7.2及以上版本支持,如果你使用的PHP版本更低,自行实现单字符转Unicode码点的逻辑替换该函数即可。 - 如果需要支持多码点组合类emoji(比如带肤色、家庭组合类emoji),只需要调整回调内的编码转换逻辑,遍历每个字符的码点用短横线拼接即可,匹配正则也可按需补充对应范围。
内容的提问来源于stack exchange,提问作者labu77
相关产品推荐
相关产品推荐

