【问题标题】:Finding beginning and end tags in custom HTML-like structure在自定义的类似 HTML 的结构中查找开始和结束标签
【发布时间】: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


【解决方案1】:

在我看来,解析是非常实用地看待事物:正则表达式一些字符,解析为标签,迭代字符,正则表达式下一个,获取标签之间的内容,隐藏到字符串......等等。等等等等。

在我看来,这种功能性的、每次添加字符时解析的方法是要求文本编辑器执行诸如标签识别、语法突出显示等任务的副产品。最简单地说,文本编辑器的“目的”是希望“模型”对象是一个充满 unicode 字符的面板,它可能会很高兴地无知,我们已经习惯于强迫它在对象模型方面“变得智能”。

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

我处理它的方式不是作为文本编辑器,而是作为 MVC 意义上的视图,表面上是文本编辑表面,但实际上是对用户行为作出反应的模板化、有序模型。

【讨论】:

  • 在您的版本中查找块(包含中间内容的开始和结束标签)的方法是什么?
  • 我没有找到标签或内容,我得到了一个像var nodes = context.Where(n =&gt;n.ElementText ="h1").ToList&lt;Element&gt;();这样的模型对象
猜你喜欢
  • 1970-01-01
  • 2014-04-22
  • 2012-10-18
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多