正则提取PHP代码里的部分数据

来源:互联网 发布:mac windows10截图 编辑:程序博客网 时间:2024/05/17 07:48

前两天一个网友在群里问用正则如何把

<if condition="张三 == 张三">是张三</if> <if condition="11>1">测试成功</if></td><td><if condition="1 > 0">男<else>女</if>

提取<if></if>中间没有<else>的代码

因为本人很久没写代码了,所以下载安装了RegexBuddy 作为正则调试工具,立马找网页看了下正则参考手册委屈 是在是痛苦啊,好久没写都忘记了,接下来就是花了10多分钟看


后来写上

<if condition="(.*)">([^<else>]*)<\/if>
发现测试成功,因为好久没写的缘故,其实是错误的,因为测试器全部标黄了 我以为是可以了,其实是全部匹配到了最后,这个接下来解释

后来我就大胆的告诉他们可以了,群里那小伙测试一下不行啊,怎么匹配截断了一部分,这时候冒出一家伙 说你那是理论,具体行不行还需要调试,然后各种喷,还发了自己的东西上来,先替换<else>什么的,搞得和php模板替换一样的复杂,我说大哥 不要那样做,你告诉想法是对的,但是处理太复杂了(黑猫白猫抓得住耗子就是好猫,但是还是要效率)


哥都不写代码了,没测试环境,被喷也无怨言了,和那小伙说等我回家给调试,回家后刚好有篮球活动,饭都没吃立马去打(身体是革命本钱啊,虽然要言而有信,但是也不能让哥累跨了吧大笑)


然后回来我把php环境工具都copy到U盘里,早上来就开始调试

后来发现原来是(.*)把后面带"的都匹配到了,结果表现为

"张三 == 张三">是张三</if> <if condition="11>1
结果一番调试最后
<?php$str='<if condition="张三 == 张三">是张三</if> <if condition="11>1">测试成功</if></td><td><if condition="1 > 0">男<else>女</if>';preg_match_all('/<if condition="(.+?)">([^<else>]*)<\/if>/is',$str,$arry);print_r($arry);?>
终于没问题了


说明:如果写成

<if condition="(.*)">([^<else>]*)<\/if>
会匹配到所有condition=""直到遇到>的数据,所以上面出现了问题


第一次写 语无伦次的,请见谅