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 foreach循环使用详解与实例代码
May 08 PHP
php is_file 判断给定文件名是否为一个正常的文件
May 10 PHP
php fsockopen中多线程问题的解决办法[翻译]
Nov 09 PHP
ThinkPHP登录功能的实现方法
Aug 20 PHP
php删除指定目录的方法
Apr 03 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
Jan 28 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
Mar 17 PHP
PHP中Restful api 错误提示返回值实现思路
Apr 12 PHP
php简单获取复选框值的方法
May 11 PHP
WordPress中的shortcode短代码功能使用详解
May 17 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
Jul 17 PHP
php实现将数据做成json的格式给前端使用
Aug 21 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与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
PHP 分页类(模仿google)-面试题目解答
2009/09/13 PHP
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
php中define用法实例
2015/07/30 PHP
php魔术方法功能与用法实例分析
2016/10/19 PHP
javascript学习网址备忘
2007/05/29 Javascript
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
jQuery unbind 删除绑定事件详解
2016/05/24 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
webpack 代码分离优化快速指北
2019/05/18 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
python del()函数用法
2013/03/24 Python
python下如何查询CS反恐精英的服务器信息
2017/01/17 Python
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
python搜索包的路径的实现方法
2019/07/19 Python
详解Python文件修改的两种方式
2019/08/22 Python
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
幼儿园中秋节活动方案2013
2014/01/29 职场文书
关于安全的标语
2014/06/10 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
身份证丢失证明
2015/06/19 职场文书
如何用Python搭建gRPC服务
2021/06/30 Python