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+DBM的同学录程序(1)
Oct 09 PHP
php 验证码制作(网树注释思想)
Jul 20 PHP
PHP句法规则详解 入门学习
Nov 09 PHP
php处理文件的小例子(解压缩,删除目录)
Feb 03 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
PHP中key和current,next的联合运用实例分析
Mar 29 PHP
功能强大的php分页函数
Jul 20 PHP
PHP多维数组排序array详解
Nov 21 PHP
php之header的不同用法总结(实例讲解)
Nov 28 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 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
PHP使用CURL模拟登录的方法
2015/07/08 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
javascript firefox兼容ie的dom方法脚本
2008/05/18 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
React中ES5与ES6写法的区别总结
2017/04/21 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
微信小程序页面生命周期详解
2018/01/31 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
一篇文章带你使用Typescript封装一个Vue组件(简单易懂)
2020/06/05 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
python使用socket连接远程服务器的方法
2015/04/29 Python
python实现同时给多个变量赋值的方法
2015/04/30 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
Jones Bootmaker官网:优质靴子和鞋子在线
2020/11/30 全球购物
土木工程毕业生自荐信
2013/09/21 职场文书
函授毕业自我鉴定
2013/12/19 职场文书
有趣的广告词
2014/03/18 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
法院四风对照检查材料思想汇报
2014/10/06 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
电影圆明园观后感
2015/06/03 职场文书
辅导员学期工作总结
2015/08/14 职场文书
无故旷工检讨书
2015/08/15 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS