PHP正则php 正则替换
今天遇到一个蛋疼的问题,归结于自己学习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);
实际表现:
希望自己下次不要搞错,继续加油
php中的<?= ?>替换<?php echo ?>php mb,strlen
PHP7.0~PHP7.1~PHP7.2~PHP7.3~PHP7.4新特性php 7.4
PHP7.0~PHP7.1~PHP7.2~PHP7.3~PHP7.4新特性php 7.2 7.3
PHP之——在WAMPSERVER下增加多版本的PHP(PHP5.3,PHP5.4,PHP5.5)支持。wampserver打开php项目
PHP之——在WAMPSERVER下增加多版本的PHP(PHP5.3,PHP5.4,PHP5.5)支持。wampserver开发php网页
PHP配置指令作用域说明(PHP,INI,PERDIR、PHP,INI,SYSTEM、PHP,INI,USER、PHP,INI,ALL)php 作用域