因为项目需要对手机端提交的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;
}
能满足大部分需求了,可以灵活应用!