php对手机端提交的emoji如何处理

因为项目需要对手机端提交的emoji进行验证,然后找了好多,测试了一些;

找到了一些靠谱的,现整理如下,分享给大家:

emoji就是表情符号,在手机里面已经是很流行使用的一种表情。

问题:插入Emoji表情,保存到数据库时报错:SQLException: Incorrect string value: '\xF0\x9F\x98\x84' for column 'review' at row 1

UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。

解决方案:

1、修改数据表结构中的字符集为 utf8mb4,但是此变动比较大,对于已发布在线的产品影响很大。

2、把它过滤掉,或者进行判断给予用户提示,这是我使用在项目中的方法


// 1.过滤掉emoji表情
function filterEmoji($str)
{
 $str = preg_replace_callback(
   '/./u',
   function (array $match) {
    return strlen($match[0]) >= 4 ? '' : $match[0];
   },
   $str);

  return $str;
}

//2.对所有提交进行表情验证
function yz_expression($arr)
{
		foreach ($arr as $key => &$value) {
		$value = preg_replace_callback('/[\xf0-\xf7].{3}/', function($r) { return '@E' . base64_encode($r[0]);},$value);

			$countt=substr_count($value,"@");
			for ($i=0; $i < $countt; $i++) {
				$c = stripos($value,"@");
				$value=substr($value,0,$c).substr($value,$c+10,strlen($value)-1);
			}
			$value = preg_replace_callback('/@E(.{6}==)/', function($r) {return base64_decode($r[1]);}, $value);

		}
		return $arr;
}

//3.对表情进行base64,不影响展示
//入库前
$text = preg_replace_callback('/[\xf0-\xf7].{3}/', function($r) { return '@E' . base64_encode($r[0]);}, $text);
//出库后
$text = preg_replace_callback('/@E(.{6}==)/', function($r) {return base64_decode($r[1]);}, $text); 


//4.对表情进行过滤
function filter_emoji($str) {  
    $regex = '/(\\\u[ed][0-9a-f]{3})/i';  
    $str = json_encode($str);  
    $str = preg_replace($regex, '', $str);
    return json_decode($str);  
}

//5.稍微把4改改就是一个判断emoji的方法
function filter_emoji($str) {
    $regex = '/(\\\u[ed][0-9a-f]{3})/i';
    $str = json_encode($str);
    $str1 = preg_replace($regex, '', $str);
    if($str!=$str1){
        return false;
    }
    return true;
}

能满足大部分需求了,可以灵活应用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值