最近,老板叫了一个数据查重的小练习,包括从包含中文字段的文件中提取中文字段,存储它们,并用php开发它们。中间涉及到php正则表达式的中文匹配问题,网上收集了大量,但没有准确的信息。修改和检查完自己的代码后,先写下extract函数。
首先要注意双字节字符的编码问题。在这里,我们将来可能会遇到像韩语和日语这样的编码问题,这和中文理解的意思是一样的。
1.GBK (GB2312/GB18030)复制码如下:x00-xff GBK双字节编码范围 x20- x7f ASCII Xi- xff中文gb2312 x80-xff中文gbk 2。UTF-8 (Unicode)副本代码。U4e00-u9fa5(中文)x3130-x318F(韩文xAC00-xD7A3(韩文)u0800-u4e00(日文))。
在记事本下,我们可以先测试自己的常规书写是否有误。我用[u4e00-u9fa5]测试第一个表达式,符号的意思不止一个。
匹配字符。结果和预期的一样,那么,这个正则化可以用在脚本中吗?
我们来测试一下。我们使用preg _ match _ all('/[ u4e 00- u9fa 5]/',$ subject,$ matches)来调用,但是您看到这样的结果:编译失败: PCRE不支持 l, l, n {name}。很大吗?原因是什么?
查阅了大量资料后,我们发现u (PCRE_UTF8)就是上面的PCRE,它是一个perl库,包括与Perl兼容的正则表达式库。此修复启用了PCRE中与Perl不兼容的附加功能。模式被视为UTF-8。Unix下的PHP 4.1.0和win32下的PHP 4.2.3都提供了这种修正。然而,php正则表达式在表示十六进制数据方面是不同的。在php中,x用于表示十六进制数据。让我们优化代码,检测功能变为:
复制代码如下:类存储数据适配器扩展存储{ private $ dsdata/* * *数据转换函数,调用preg_match_all根据$pattern正则性进行数值匹配,并将返回的结果以数组形式存储在$matches中,* $matches[0]将包含匹配整个模式的文本,$matches[1]将包含匹配第一个捕获括号中的子模式的文本。以此类推* @参见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 store data adapter($ txt content);$ match=array();$ DSNAmE=$ store-data _ convert('/[ x7f- xff]/',$ TxtContent);foreach($ dsName as $ val){ echo $ val。br ';}
输入文件是:
,以下是提取中文后的输出文件内容:
,满足预期需求。