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学习 计数器实例代码
Jun 15 PHP
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
Oct 31 PHP
PHP session有效期session.gc_maxlifetime
Apr 20 PHP
PHP系列学习之日期函数使用介绍
Aug 18 PHP
PHP获取中英混合字符串长度的方法
Jun 07 PHP
Laravel 4 初级教程之Pages、表单验证
Oct 30 PHP
PHP中Closure类的使用方法及详解
Oct 09 PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 PHP
PHP中CheckBox多选框上传失败的代码写法
Feb 13 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
May 05 PHP
PHP实现用户登录的案例代码
May 10 PHP
PHP下用Swoole实现Actor并发模型的方法
Jun 12 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
推荐几个开源的微信开发项目
2014/12/28 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
php上传excel表格并获取数据
2017/04/27 PHP
动态载入/删除/更新外部 JavaScript/Css 文件的代码
2010/07/03 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
js中this的用法实例分析
2015/01/10 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
jQuery扩展+xml实现表单验证功能的方法
2016/12/25 Javascript
Vue.js实现模拟微信朋友圈开发demo
2017/04/20 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
[01:39](回顾)各路豪强针锋相对,几经鏖战四强产生
2014/07/01 DOTA
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
python里对list中的整数求平均并排序
2014/09/12 Python
Python全排列操作实例分析
2018/07/24 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
python压包的概念及实例详解
2021/02/17 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
大都会艺术博物馆商店:The Met Store
2018/06/22 全球购物
英国自行车商店:AW Cycles
2021/02/24 全球购物
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
个人综合鉴定材料
2014/05/23 职场文书
毕业生工作求职信
2014/06/30 职场文书
工作总结与自我评价
2014/09/18 职场文书
开学第一周值周总结
2015/07/16 职场文书
男方家长婚礼致辞
2015/07/27 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
高中班主任寄语
2019/06/21 职场文书