我觉得你们应该招聘一个会正则表达式的人了。[Bug]

浏览:601 发布日期:2013/07/02 分类:站务建议 关键字: 正则表达式 bug
本来我是没有接触过这个框架的,刚才看了一下网上开源的PHP源码,它们使用了ThinkPHP,就顺便了解了一下ThinkPHP。
我在ThinkPHP2.x的ThinkTemplateCompiler.class.php文件当中的
function parsexmlTag()当中找到了这么一行:$content = preg_replace('/'.$begin.$tag.'\s(.*?)'.$end.'(.+?)'.$begin.'\/'.$tag.'(\s*?)'.$end.'/eis',"\$this->parseXmlItem('$tag','\\1','\\2')",$content);我以为你们使用了什么技巧,不过测试之后才发现你们把正则表达式写错了。

如果模板当中有以下xml标签:
<tag name="tom">content1 <tagname="tom">content2</tag></tag>

处理之后很有可能变成这样:
content1 content2</tag>
多了个“</tag>”。

关于正则表达式匹配html(xml)标签我要在这里说一下:

有人把匹配标签的正则表达式写成了这样:
/<div>.+<\/div>/
这肯定写错了,贪婪匹配的原则会让它一直匹配到底。
比如<div>content1</div>content2<div>content3</div>,匹配结果就是<div>content1</div>content2<div>content3</div>。

当然我们可以在搜索引擎上搜索到这样一种答案:
/<div>.+?<\/div>/
ThinkPHP的模板系统就使用了类似于这个的正则表达式。虽然改为非贪婪的可以解决以上问题。但如果你认为这样就可以正确匹配标签,那你就太天真了。
如果标签有嵌套:
<div>content1<div>content2</div></div>
匹配结果就是<div>content1<div>content2</div>,这很显然不是我们想要的。
最佳答案
评论( 相关
后面还有条评论,点击查看>>