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
wordpress之wp-settings.php
Aug 17 PHP
php xml常用函数的集合(比较详细)
Jun 06 PHP
PHP中unset,array_splice删除数组中元素的区别
Jul 28 PHP
php获取根域名方法汇总
Oct 28 PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 PHP
PHP进程同步代码实例
Feb 12 PHP
日常整理PHP中简单的图形处理(经典)
Oct 26 PHP
既简单又安全的PHP验证码 附调用方法
Jun 02 PHP
php mysqli查询语句返回值类型实例分析
Jun 29 PHP
php修改数组键名的方法示例
Apr 15 PHP
php使用json-schema模块实现json校验示例
Sep 28 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导出oracle库的php代码
2009/04/20 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
2014/07/30 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
php中this关键字用法分析
2016/12/07 PHP
解决laravel 5.1报错:No supported encrypter found的办法
2017/06/07 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
2016/05/25 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
JavaScript中的 new 命令
2019/05/22 Javascript
KnockoutJS数组比较算法实例详解
2019/11/25 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
python flask中动态URL规则详解
2019/11/22 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
2014年最新学习全国两会精神心得
2014/03/17 职场文书
教师师德演讲稿
2014/05/06 职场文书
预备党员转正材料
2014/12/19 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书
东京审判观后感
2015/06/01 职场文书
火烧圆明园观后感
2015/06/03 职场文书
公司转让协议书
2016/03/19 职场文书
Python基础详解之邮件处理
2021/04/28 Python
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL