PHP中使用正则表达式提取中文实现笔记


Posted in PHP onJanuary 20, 2015

最近老板叫做一个数据查重的小练习,涉及从一个包含中文字段的文件中提取出其中的中文字段并存储,使用php开发。中间涉及到php正则表达式中文匹配的问题,网上搜罗一大片,但是也很乱没有一个准信儿,经过自己的代码的修改和检验,先将extract函数写下。

首先要注意到的是,双字节字符的编码问题,这里我们以后还可能会遇到像韩文、日文等编码问题,与中文理解上是一个意思。

1. GBK (GB2312/GB18030)

\x00-\xff GBK双字节编码范围   

\x20-\x7f ASCII   

\xa1-\xff 中文 gb2312   

\x80-\xff 中文 gbk  
 
2. UTF-8 (Unicode)
\u4e00-\u9fa5 (中文)   

\x3130-\x318F (韩文   

\xAC00-\xD7A3 (韩文)   

\u0800-\u4e00 (日文) 

在Notepad++下面,我们可以首先进行测试我们的正则书写的错误与否。第一个表达式我是使用[\u4e00-\u9fa5]+来检验的,+号表示不止一个

PHP中使用正则表达式提取中文实现笔记

匹配符。结果与预期相同,那么,是否在脚本中就可以使用这个正则了呢?

我们测试一下,我们使用preg_match_all(‘/[\u4e00-\u9fa5]+/', $subject,$matches)调用,然后你却看到了这么一个结果:Compilation failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 2。。。。是不是很头大??这究竟是什么原因?

查阅了很多资料后发现,u (PCRE_UTF8),就是上面的PCRE,这是是一个Perl库,包括 perl 兼容的正规表达式库。此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。而php正则表达式对于十六进制数据的表达方式上也有所不同,在php中,是用\x表示十六进制数据的。下面我们就将代码优化一下,检测函数变为:

 class storeDataAdapter extends Store{   

        private $dsData;   

        /**  

         * 数据转换函数,调用preg_match_all根据$pattern正则来进行数值匹配,并将返回的结果以数组形式存储在$matches中,  

         * $matches[0]将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推  

         * @see Store::data_convert()  

         */  

        public function data_convert($pattern,$subject) {   

            $matches=array();   

            if (preg_match_all($pattern, $subject,$matches)){   

                return $matches[0];   

            }else    

            {   

                return null;   

            }   

        }   

    } 

调用的时候变为:

 $store=new storeDataAdapter($txtContent);   

    $match=array();   

    $dsName=$store->data_convert(‘/[\x7f-\xff]+/',$txtContent);   

    foreach ($dsName as $val){   

        echo $val."<br>";   

    }  

输入文件为:

PHP中使用正则表达式提取中文实现笔记

,下面是提取出中文之后的输出文件内容:

PHP中使用正则表达式提取中文实现笔记

,符合预期需求。

PHP 相关文章推荐
PHP开发文件系统实例讲解
Oct 09 PHP
用PHP获取Google AJAX Search API 数据的代码
Mar 12 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
php防止伪造的数据从URL提交方法
Jun 27 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
php 实现301重定向跳转实例代码
Jul 18 PHP
php封装单文件上传到数据库(路径)
Oct 15 PHP
PHP自动识别当前使用移动终端
May 21 PHP
PHP常量define和const的区别详解
May 18 PHP
YII2框架中查询生成器Query()的使用方法示例
Mar 18 PHP
PHP解决高并发问题
Apr 01 PHP
php将xml转化对象的实例详解
Nov 17 PHP
php中的观察者模式简单实例
Jan 20 #PHP
php 5.6版本中编写一个PHP扩展的简单示例
Jan 20 #PHP
PHP函数extension_loaded()用法实例
Jan 19 #PHP
php使用正则表达式获取图片url的方法
Jan 16 #PHP
php使用CURL伪造IP和来源实例详解
Jan 15 #PHP
php+mysql实现无限分类实例详解
Jan 15 #PHP
php截取html字符串及自动补全html标签的方法
Jan 15 #PHP
You might like
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
2013/08/07 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
2015/09/25 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
33个优秀的 jQuery 图片展示插件分享
2012/03/14 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
JQuery动画animate的stop方法使用详解
2014/05/09 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
javascript的push使用指南
2014/12/05 Javascript
jquery制作属于自己的select自定义样式
2015/11/23 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
JS实现数字格式千分位相互转换方法
2016/08/01 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
js中开关变量使用实例
2017/02/24 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
python实现简易通讯录修改版
2018/03/13 Python
Python实现注册、登录小程序功能
2018/09/21 Python
opencv实现图片模糊和锐化操作
2018/11/19 Python
Python3实现的简单三级菜单功能示例
2019/03/12 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
python 定时器每天就执行一次的实现代码
2019/08/14 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
Python序列化pickle模块使用详解
2020/03/05 Python
为什么是 Python -m
2020/06/19 Python
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
C语言开发工程师测试题
2016/12/20 面试题
家居设计专业个人自荐信范文
2013/11/26 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
乡镇2014法制宣传日活动总结
2014/11/01 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
python之PySide2安装使用及QT Designer UI设计案例教程
2021/07/26 Python