2017-03-09 82 views
0

我正在使用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)。什么是实现这一目标的好方法?

+1

你应该尝试以几种不同的方式实现它 - 这就是你如何学习,你可以做到!当你遇到某些特定的事情时***回来并寻求帮助。 – caesay

+1

要真正做到“正确”,你需要做轻松/解析,几乎你说你不想做的事情。要做到这一点“快速”搜索你的字符串罚款每个{{#each}}和读取{{/每个}}。这个函数然后是递归的,所以它支持嵌套条目。如果有很多不同的标签,你需要处理所有这些。编写这样一个解析器是一项艰巨的任务,如果你想展示你所尝试过的东西,我会很乐意提供帮助,但这是一项非常重要的任务,我怀疑你会找到一个能够做到这一点的人你在这里。 SO是为了帮助,而不是编码器4免费。 – dman2306

+0

'好'的方法是编写一个分析器,它知道状态和嵌套元素等 - 而不是正则表达式字符串替换。为什么你不想编写一个解析器(我认为你的意思是'全面编译器')? – Tim

回答

0

在我看来,解析非常功能看事情:正则表达式一些字符<>,解析为标签,重复字符,正则表达式的下一个<>,获得其间的内容标签,隐蔽串...等。等等等等。

在我看来,这种功能性的,每次添加字符的解析方法都是要求文本编辑器执行标签识别,语法高亮等任务的副产品。大多数简单地说,文本编辑器的“目的”是希望一个“模型”对象成为一个充满unicode字符的面板,它可能是非常无知的,并且我们已经习惯于迫使它在对象模型中“变得聪明” 。

我一直在设计我自己的版本,在Monarch编辑器里面(这可能是我们在2017和2年可以做的最好的)中“伤害我很多”HTML标签之后进行的。愚蠢复杂。)

我接近它的方式不是作为文本编辑器,而是作为MVC意义上的一个视图,它表面上是一个文本编辑表面,但实际上是一个模板化的,有序的模型,它对用户行为。

+0

在您的版本中查找块(包含中间内容的开始和结束标签)的方法是什么? –

+0

我没有找到标签或内容,我得到一个模型对象,例如'var nodes = context.Where(n => n.ElementText =“h1”)。ToList ();' – NWoodsman