我在ThinkPHP2.x的ThinkTemplateCompiler.class.php文件当中的
function parsexm
$content = preg_replace('/'.$begin.$tag.'\s(.*?)'.$end.'(.+?)'.$begin.'\/'.$tag.'(\s*?)'.$end.'/eis',"\$this->parseXmlItem('$tag','\\1','\\2')",$content);我以为你们使用了什么技巧,不过测试之后才发现你们把正则表达式写错了。如果模板当中有以下xm
<tag name="tom">content1 <tagname="tom">content2</tag></tag>
处理之后很有可能变成这样:
content1 content2</tag>
多了个“</tag>”。
关于正则表达式匹配html(xm
有人把匹配标签的正则表达式写成了这样:
/<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>,这很显然不是我们想要的。
最佳答案