我正在使用C#中的HTML模板引擎。我希望实现一些与Handlebars.Net(Handlebars.js的C#实现)之类的库相同的功能,除了使用基本的字符串操作(查找/替换)而不是完整的编译器。
语法如下:
{{#each item in items}}
<li>{{item.Name}}</li>
{{/each}}
我希望用Regex进行简单的字符串替换,但我意识到Regex在这方面会有缺点,比如在下面的例子中查找结束标记(它会找到第一个嵌入{{/ 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)。实现这一目标的好方法是什么?
答案 0 :(得分:0)
在我看来,解析是非常功能性的东西:正则表达式一些字符&lt;&gt ;,解析为标记,迭代字符,正则表达式下一个&lt;&gt;,获取内容在标签之间,隐藏到字符串......等。等等。
在我看来,这个功能性,解析 - 每次添加一个字符的方法是要求文本编辑器执行标签识别,语法突出显示等任务的副产品。最简单的说,一个文本编辑的“目的”是期望一个“模型”对象是一个充满unicode角色的面板,它可能是幸福无知的,而且我们已经习惯于强迫它变得对对象模型“变得聪明”。
在Monarch编辑器内部使用“伤害我很多”的HTML标签后,我一直在设计我自己正在制作的版本(这可能是2017年我们可以做的最好的事情.2。愚蠢地复杂。)
我接近它的方式不是作为文本编辑器,而是作为MVC意义上的视图,表面上是一个文本编辑表面,但实际上是一个模板化的有序模型,它对用户行为有反应。