php正则表达式提取中文

severaltipsaboutRegularExpressions

//$pattern = “/file-([0-2]d{3})-([1-9]d?)/”;
这个正则表达式,对文件夹的月日进行捕获,再进一步判断处理 

最近老板叫做一个数据查重的小练习,涉及从一个包含中文字段的文件中提取出其中的中文字段并存储,使用php开发。中间涉及到php正则表达式中文匹配的问题,网上搜罗一大片,但是也很乱没有一个准信儿,经过自己的代码的修改和检验,先将extract函数写下。

1.processforgreedy

02 for($i =2005;$i<=2009;$i++) 

首先要注意到的是,双字节字符的编码问题,这里我们以后还可能会遇到像韩文、日文等编码问题,与中文理解上是一个意思。

Bydefault,thequantifiersaregreedy,thatis,they

03 { 

  1. GBK (GB2312/GB18030)

matchasmuchaspossible(uptothemaximumnumberofper-

04 for($j = 1;$j<30;$j++) 

x00-xff GBK双字节编码范围

mittedtimes),withoutcausingtherestofthepatternto

05 { 

x20-x7f ASCII

fail.Theclassicexampleofwherethisgivesproblemsisin

06 $dest_dir = “text/file-“.$i.”-$j”; 

xa1-xff 中文 gb2312

tryingtomatchcommentsinCprograms.Theseappearbetween

07 if(!is_dir($dest_dir)) mkdir($dest_dir,0777); 

澳门新葡萄京官网首页,x80-xff 中文 gbk

thesequences/*and*/andwithinthesequence,individual

08 } 

  1. UTF-8 (Unicode)

*and/charactersmayappear.AnattempttomatchCcom-

09 } 

u4e00-u9fa5 (中文)

mentsbyapplyingthepattern

10 //创建一些不满足条件的文件夹 

x3130-x318F (韩文

//*.*/*/

11   

xAC00-xD7A3 (韩文)

tothestring

12 for($t = 0;$t<10;$t++) 

u0800-u4e00 (日文)

/*firstcommand*/notcomment/*secondcomment*/

13 { 

在Notepad++下面,我们可以首先进行测试我们的正则书写的错误与否。第一个表达式我是使用[u4e00-u9fa5]+来检验的,+号表示不止一个

fails,becauseitmatchestheentirestringduetothe

14 $dest_dir = “text/file-“.$t; 

澳门新葡萄京官网首页 1

greedinessofthe.*item.

15 if(!is_dir($dest_dir)) mkdir($dest_dir,0777); 

匹配符。结果与预期相同,那么,是否在脚本中就可以使用这个正则了呢?

However,ifaquantifierisfollowedbyaquestionmark,

16 } 

我们测试一下,我们使用preg_match_all(‘/[u4e00-u9fa5]+/’,
$subject,$matches)调用,然后你却看到了这么一个结果:Compilation failed:
PCRE does not support L, l, N{name}, U, or u at offset
2。。。。是不是很头大??这究竟是什么原因?

thenitceasestobegreedy,andinsteadmatchestheminimum

17   

查阅了很多资料后发现,u
(PCRE_UTF8),就是上面的PCRE,这是是一个Perl库,包括 perl
兼容的正规表达式库。此修正符启用了一个 PCRE 中与 Perl
不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0
起可用,在 win32 下自 PHP 4.2.3
起可用。而php正则表达式对于十六进制数据的表达方式上也有所不同,在php中,是用x表示十六进制数据的。下面我们就将代码优化一下,检测函数变
为:

numberoftimespossible,sothepattern

18 //遍历文件夹处理 . 

classstoreDataAdapterextendsStore{private$dsData;/***
数据转换函数,调用preg_match_all根据$pattern正则来进行数值匹配,并将返回的结果以数组形式存储在$matches中,*
$matches[0]将包含与整个模式匹配的文本,$matches[1]
将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推*@seeStore::data_convert()*/publicfunction
data_convert($pattern,$subject)
{$matches=array();if(preg_match_all($pattern,
$subject,$matches)){return$matches[0];}else{returnnull;}}}

//*.*?/*/

19 function listFile($dir) 

调用的时候变为:

小结:

20 {  

$store=newstoreDataAdapter($txtContent);$match=array();$dsName=$store->data_convert(‘/[x7f-xff]+/’,$txtContent);foreach($dsNameas$val){echo$val.”
“;      }

?与/U有类似功能,但同时出现彼此抵消

21 $a = array(); 

输入文件为:

如下:

22 $handle = opendir($dir); 

澳门新葡萄京官网首页 2

$a=asdf/*asdfaldsfasdf*/asfdasldf;kfldsj*/asfddsaf;

23 while($file = readdir($handle)) 

,下面是提取出中文之后的输出文件内容:

$pattern=////*.*?/*///;

24 { 

澳门新葡萄京官网首页 3

//$pattern=////*.*/*///U;

25 handle_dir($dir,$file,&$a); 

,符合预期需求。

//$pattern=////*.*?/*///U;

26 } 

百度试了好多方法都不行,原来是自己没有匹配多个

preg_match($pattern,$a,$match);

27   

原文:

print_r($match);

28 echo “the rege_array is “; 

29 print(“<pre>”); 

2.Assertions

30 print_r($a); 

/w+(?=;)

31 print(“</pre>”); 

matchesawordfollowedbyasemicolon,butdoesnotinclude

32 } 

thesemicoloninthematch,and

33   

foo(?!bar)

34 function handle_dir($dir,$file,$a) 

matchesanyoccurrenceoffoothatisnotfollowedby

35 { 

bar.Notethattheapparentlysimilarpattern

36   

小结:

37 if($file == “.” || $file == “..”) return ; 

(?!)只前向判断匹配,如bar(?!foo),而(?!foo)bar没有意义

38 $minYear = 2008; 

(?

39 $maxDay = 13; 

40   

41 $pattern = “/file-([0-2]d{3})-([1-9]d?)/”; 

42 $destPath = $dir.”/”.$file; 

43   

44 if(!is_dir($destPath)) 

45 { 

46 //echo “$destPath is not a dir ;”; 

47 return; 

48 } 

49   

50 //删除不满足格式的文件 

51 if(!preg_match($pattern,$file)) 

52 { 

53 //echo “<font color=blue>$file</font><font
color=red>is not the right rege. the program will unlink — $destPath
–</font><br/>”; 

54 // unlink($destPath); 

55 return; 

56 } 

57   

58 preg_match_all($pattern,$file,$matchs); 

59   

60 //echo “<font color=blue>$file</font> is the right
rege”; 

61 //print_r($matchs); 

62 //echo “the year is “.$matchs[1][0].” and the day is
“.$matchs[2][0].”</br>”; 

63 if(intval($matchs[1][0]) >$minYear &&
intval($matchs[2][0]) < $maxDay) 

64 { 

65 $a[]= $destPath; 

66 }else { //不满足条件的 

67 //unlink($destPath); 

68   

69 } 

70 } 

71   

72 listFile(“text”);

发表评论

电子邮件地址不会被公开。 必填项已用*标注