我正在使用C#编写HTML模板引擎。除了使用基本的字符串操作(查找/替换)而不是完整的编译器外,我想实现与Handlebars.Net(Handlebars.js的C#实现)等库类似的功能。在自定义HTML结构中查找开始和结束标记
语法将一些诸如:
{{#each item in items}}
<li>{{item.Name}}</li>
{{/each}}
我希望做简单的字符串替换使用正则表达式,但我知道正则表达式将在这方面有不足之处,比如在本例中发现的结束标记下面(它会找到第一个嵌入{{/每}}而不是最后分析的第一个标签时):
{{#each item in items}} //while parsing this tag...
<p>{{item.Name}}'s Hobbies:</p>
<ul>
{{#each hobby in item}}
<li>{{hobby.Name}}</li>
{{/each}} //this end tag would be found first
</ul>
{{/each}} //rather than this one
我需要找到任何给定的“标记”(如开头和结尾{ {#each}} ... {{/ each}}),并创建一个类似DOM的结构来解析每个标签的内容。 “DOM”可以嵌入多个标签(认为嵌入的foreach循环x4)。什么是实现这一目标的好方法?
你应该尝试以几种不同的方式实现它 - 这就是你如何学习,你可以做到!当你遇到某些特定的事情时***回来并寻求帮助。 – caesay
要真正做到“正确”,你需要做轻松/解析,几乎你说你不想做的事情。要做到这一点“快速”搜索你的字符串罚款每个{{#each}}和读取{{/每个}}。这个函数然后是递归的,所以它支持嵌套条目。如果有很多不同的标签,你需要处理所有这些。编写这样一个解析器是一项艰巨的任务,如果你想展示你所尝试过的东西,我会很乐意提供帮助,但这是一项非常重要的任务,我怀疑你会找到一个能够做到这一点的人你在这里。 SO是为了帮助,而不是编码器4免费。 – dman2306
'好'的方法是编写一个分析器,它知道状态和嵌套元素等 - 而不是正则表达式字符串替换。为什么你不想编写一个解析器(我认为你的意思是'全面编译器')? – Tim