扫一扫浏览

PHP采集入库对内容中的特殊字符处理

未结贴
0 551
鸿哥站长未认证 2018-07-18 09:54:54
收藏

今天Linux上用PHP做采集入库遇到了mysql的报错:SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF4\x8F\xB1\x82\xF4\x8F...' for column 'content' at row 1

1531878758892403.png

远程mysql版本为5.7;

通过排查发现是内容中有特殊字符,按照网上的方式把数据库和表的字符集改为:utf8mb4  没用,问题依旧。

在本地Windows上测试没有报错,但插入的内容是不完整的;特殊字符后面的内容是被截断了的

1531878804804369.png

那么就在插入之前再用程序过滤吧,虽然这样有损效率;

PHP过滤特殊字符代码:

/**
* 过滤字符串,保留UTF8字母数字中文及部份符号
* www.timeblog.cn
* @param  String $ostr 
* @return String
*/
public function filter_utf8_char($ostr){
    preg_match_all('/[\x{FF00}-\x{FFEF}|\x{0000}-\x{00ff}|\x{4e00}-\x{9fff}]+/u',$ostr,$matches);
    $str=join('', $matches[0]);
    /*含有特殊字符需要逐个处理*/
    if($str==''){
        $returnstr='';
        $i=0;
        $str_length=strlen($ostr);
        while($i<=$str_length){
            $temp_str=substr($ostr,$i,1);
            $ascnum=Ord($temp_str);
            if($ascnum>=224){
                $returnstr=$returnstr.substr($ostr,$i,3);
                $i=$i+3;
            }elseif($ascnum>=192){
                $returnstr=$returnstr.substr($ostr,$i,2);
                $i =$i+2;
            }elseif($ascnum>=65 && $ascnum<=90){
                $returnstr=$returnstr.substr($ostr,$i,1);
                $i=$i+1;
                /*特殊字符*/
            }elseif($ascnum>=128 && $ascnum<=191){
                $i=$i+1;
            }else{
                $returnstr=$returnstr.substr($ostr,$i,1);
                $i=$i+1;
            }
        }
        $str=$returnstr;
        preg_match_all('/[\x{FF00}-\x{FFEF}|\x{0000}-\x{00ff}|\x{4e00}-\x{9fff}]+/u',$str,$matches);
        $str=join('',$matches[0]);
    }
    return $str;
}
文章来自于时间博客:《 PHP采集入库对内容中的特殊字符处理
最近热帖 HOT TOPIC
thinkphp5隐藏默认模块的一些问题 1486
【全套视频】thinkphp5视频教程 1442
教你如果处理高并发数据不同步的问题php篇 1238
tpframe安装教程 1187
TPFrame框架robot模块重磅来袭,内附2.1版本 1181
tpframe新建主题 1159
父元素flex之后,子元素高度自适应问题 1152
tpframe应用目录结构 1107
slide模块发布 1095
thinkphp5自动完成操作,两次运行的详解 1087
月度热议HOT COMMENTS
tpframe 后续版本你希望有的功能是什么(分享贴) 12
关于tpframe的一点话题 6
cms插件在分类排序的时候JSON错误 6
基于tpframe v3.x 的微信公众号插件已批量上线 5
新增的管理员没有权限操作CMS模块。 3
api接口文档插件easydoc的基本用法,快速搞定接口文档 3
tpframe插件tcms插件v2.2已发布上线,欢迎下载使用 3
thinkphp5自动完成操作,两次运行的详解 2
tpframe-curd操作之添加数据 2
tpframe能带给你的,让你快速搞定各服务端(api,pc,mobile,wechat)代码的框架 2
爆料早知道:TPFrame v3.2版本已更新我有好想法