建站帮助

诚信合作, 高质专业!

Phpcms v9文章采集过滤Emoji表情的方法

2020-02-22 14:21:44 浏览 我要评论

最近运维项目Phpcms v9采集文章入库过程中,碰到这种情况:当文章内容中含有Emoji表情时文章发布后,前台显示是完整的,但再次编辑时发现编辑器里边显得内容不完整、文章被断开了,编辑器切换到源码也是看不到完整数据。经过检查这是由于默认Phpcms v9存到Mysql数据库不支持保存Emoji字符而导致数据断开没存入到Mysql中,今天CMSYOU在这里与大家来分享Phpcms v9文章采集过滤Emoji表情的方法。

先来了解下Emoji字符和Phpcms v9文章保存机制。

Emoji(絵文字,词义来自日语えもじ,e-moji,moji在日语中的含义是字符)是一套起源于日本的12x12像素表情符号,由栗田穣崇(Shigetaka Kurit)创作,最早在日本网络及手机用户中流行。自苹果公司发布的iOS 5输入法中加入了emoji后,这种表情符号开始席卷全球,目前emoji已被大多数现代计算机系统所兼容的Unicode编码采纳,普遍应用于各种手机短信和社交网络中,不少网友用emoji图案玩猜字游戏或用于表情。

最初日本的三大电信运营商各自有不同的字符定义,分别是DoCoMo、KDDI和Softbank。随着iOS内置了Softbank的版本,emoji在全球范围内风靡(iOS5版本以前)。而Google又自己定义了一套emoji字符。iOS5以后,apple采用了unicode定义的emoji字符(iOS5版本以后)。

unicode定义的emoji是四个字符,softbank为3个字符,emoji的四个字符从存储到展示对应没有做过考虑的系统来说,简直就是灾难。

默认Phpcms v9的Mysql数据库类型为utf8字符集,于是会出现存蓄问题,解决Phpcms v9文章入库Emoji字符的方法,还是得从Mysql入手。

方法一:将数据库修改未utf8mb4字符集,解决Phpcms v9文章不能保存Emoji字符的问题。

如果你的mysql版本>=5.5.3,你可以尝试直接将utf8直接升级为utf8mb4字符集,数据上不用做转换,基本上不会有丢失。当然,记得设置前尽量先备份好再操作。

这样,4字节的utf8编码可完美兼容旧的3字节utf8字符集,并且可以直接存储emoji表情,至于字节增大带来的性能损耗,中小项目可以忽视。

方法二:增加Emoj过滤函数,入库前先将数据过滤、避免Phpcms v9文章不能保存Emoji字符。

具体方法:修改phpcms/libs/functions/extention.func.php文件,加入以下Emoj过滤函数。

//过滤掉emoji表情 @cmsyou

function filterEmoji($str){

    $str = preg_replace_callback(

            '/./u',

            function (array $match) {

                return strlen($match[0]) >= 4 ? '' : $match[0];

            },

            $str);

     return $str;

}

这一过滤函数的原理是:遍历字符串中的每个字符,如果该字符的长度为4个字节,就将其删除。

或者使用这一函数过滤也可以:

//过滤掉emoji表情 @cmsyou

function filterEmoji($string){

    $regex_emoticons = '/[\x{1F600}-\x{1F64F}]/u';

    $clear_string = preg_replace($regex_emoticons, '', $string);

    $regex_symbols = '/[\x{1F300}-\x{1F5FF}]/u';

    $clear_string = preg_replace($regex_symbols, '', $clear_string);

    $regex_transport = '/[\x{1F680}-\x{1F6FF}]/u';

    $clear_string = preg_replace($regex_transport, '', $clear_string);

    $regex_misc = '/[\x{2600}-\x{26FF}]/u';

    $clear_string = preg_replace($regex_misc, '', $clear_string);

    $regex_dingbats = '/[\x{2700}-\x{27BF}]/u';

    $clear_string = preg_replace($regex_dingbats, '', $clear_string);

    return $clear_string;

}

这一过滤函数的原理是:遍历字符串中的字符,判断替换。

之后,修改内容模型文件phpcms/model/content_model.class.php中的public function add_content函数中,在$id = $modelinfo['id'] = $this->insert($systeminfo,true);数据入库前对content内容过滤:

//过滤中Emoji表情 @cmsyou

$modelinfo['content'] = filterEmoji($modelinfo['content']);

这样把Emoji表情过滤掉。

举一反三,类似的方法,还可以使用base64把内容先编码转换保存到数据库,之后在调用的时候再decode,这也不失为一个方法。

以上是CMSYOU最近碰到的Phpcms v9文章采集过滤问题,希望能帮到大家,再次感谢大家一直支持CMSYOU.com,多谢!

我要收藏
点个赞吧

相关阅读

本月热门

精选推荐

在线客服

扫一扫,关注我们

扫一扫,关注我们