今天遇到一个蛋疼的问题,归结于自己学习PHP正则表达式没有学好的缘故。所以明天要认真再把有关正则的教材啃一遍。
问题的关键在于,preg_match_all对于有换行和没有换行的的匹配是不同的:对于没有换行的匹配采用的是贪婪匹配,对于换行(\n)的匹配采用的是懒惰匹配。
<toppost> <post> <board>美好</board> <title>散财求祝福</title> <title_esc>心情很好</title_esc> <reply_count>187</reply_count> <author>chinasoul</author> </post> <post> <board>悲伤的</board> <title>代MM诚pie我科GG 有王道 非诚勿扰</title> <title_esc>心情很差</title_esc> <reply_count>26</reply_count> <author>bioboy</author> </toppost> |
没有换行的代码1: $byhhTopLi=""; $fcontents=file_get_contents("x10.xml"); $fcontents=iconv("GB2312","UTF-8//IGNORE",$fcontents); //$fcontents = preg_replace('/\n/','zdk', $fcontents); $fcontents=str_replace("\n","zdk",$fcontents);//使用的是字符串str的替换回车方式 echo $fcontents; preg_match_all('{<board>(.*)</board>zdk<title>(.*)</title>}',$fcontents,$reg); print_r($reg); 结果是: 可以看到匹配结果采用的是贪婪模式 |
没有换行的代码2 $byhhTopLi=""; $fcontents=file_get_contents("x10.xml"); $fcontents=iconv("GB2312","UTF-8//IGNORE",$fcontents); $fcontents = preg_replace('/\n/','zdk', $fcontents);//使用的是preg_replace的替换回车方式 //$fcontents=str_replace("\n","zdk",$fcontents); echo $fcontents; preg_match_all('{<board>(.*)</board>zdk<title>(.*)</title>}',$fcontents,$reg); print_r($reg); 结果是: 结果与1类似,依旧是贪婪匹配。 |
好,让我们看看这个问题的解决方法:方法就是PHP正则表达式模式修正符U(U是指“匹配最近的字符串”)。
以上两例修改后的运行结果: |
好的,让我们看看有换行的带匹配字符块的表现吧
有换行的代码: $byhhTopLi=""; $fcontents=file_get_contents("x10.xml"); $fcontents=iconv("GB2312","UTF-8//IGNORE",$fcontents); //$fcontents = preg_replace('/\n/','zdk', $fcontents); //$fcontents=str_replace("\n","zdk",$fcontents); echo $fcontents; preg_match_all('{<board>(.*)</board>\n<title>(.*)</title>}',$fcontents,$reg); print_r($reg); 实际表现: |
希望自己下次不要搞错,继续加油
共同学习,写下你的评论
评论加载中...
作者其他优质文章