建站幫助

誠信合作, 高質專業!

微信自动秒抢红包:Phpcms v9文章采集過濾Emoji表情的方法

2020-02-22 14:21:44 瀏覽 我要評論

抢红包神器 www.eabddp.com.cn 最近運維項目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文章采集過濾問題,希望能幫到大家,再次感謝大家一直支持www.eabddp.com.cn,多謝!

我要收藏
點個贊吧

相關閱讀

本月熱門

精選推薦

在線客服 抢红包神器

掃一掃,關注我們

掃一掃,關注我們