【发布时间】:2017-03-09 18:59:31
【问题描述】:
我正在开发 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)。实现这一目标的好方法是什么?
【问题讨论】:
-
你应该尝试自己用几种不同的方式来实现它——这就是你学习的方式,你可以做到!当您遇到特定的问题时,请回来寻求帮助。
-
要真正做到“正确”,您需要进行词法分析/解析,几乎就是您说您不想做的事情。要做到这一点,“快速”搜索你的字符串,每个 {{#each}} 并读取到 {{/each}}。然后,此函数将是递归的,因此它支持嵌套条目。如果有很多不同的标签,您需要处理所有这些标签。编写这样的解析器是一项艰巨的任务,如果您想展示您尝试过的内容,我很乐意提供帮助,但这是一项非常艰巨的任务,我怀疑您是否会找到愿意做的人你在这里。 SO 是为了寻求帮助,而不是免费的 coder 4。
-
'good' 方法是编写一个解析器,它知道状态和嵌套元素等——而不是正则表达式字符串替换。为什么你不想写一个解析器(我假设你的意思是“完整的编译器”)?
-
这种问题使用Regex不是一个好主意,这里是why。您将需要构建自定义解析器或使用现有库,如 HandleBars.net。
-
@Xiaoy312 我最初只打算使用正则表达式来查找每个开始标签,此时我需要一个额外的过程来找到正确的结束标签。然后我会找到中间的所有内容并根据该信息创建一个对象。
标签: c# html templating templating-engine