【发布时间】:2019-01-24 03:18:08
【问题描述】:
背景:我只是在摆弄一个仅提供 if/for/render 的简单模板的想法,以了解它的可行性以及在我的个人项目中使用是否有意义。与使用 NVelocity 或 Razor 或其他任何东西相反。
我写了一个正则表达式:
(?:(?:(?<open>\[if (?<if>[a-zA-Z0-9\.]+)\])(?<content>[^\[]*))+(?:[^\[]*(?<close-open>\[end if\]))+)+(?(open)(?!))
当与示例文本一起使用时:
<div>
[if variable3]{{variable3}}[end if]
</div>
<div>
[if variable1]
{{variable1}}
[if variable2]
<br>
{{variable2}}
[end if]
[end if]
</div>
它按预期工作。我得到 2 个匹配项,如果第 2 个匹配项有效,我可以解析内部捕获。
问题是如果我有多个嵌套匹配。所以给定:
<div>
[if variable3]{{variable3}}[end if]
</div>
<div>
[if variable1]
{{variable1}}
[if variable2]
<br>
{{variable2}}
[end if]
[if variable4]
<br>
{{variable4}}
[end if]
[if variable5]
<br>
{{variable5}}
[end if]
[end if]
</div>
我最终得到的是第一个捕获是正确的,然后是所有 3 个单独的捕获,而不是第二个匹配的外部捕获。
如果我扩展捕获以忽略内部内容的 \[,它会导致第一个和第二个匹配组合成一个匹配。 :(
有谁知道如何解决这个问题? (如果您对如何执行此模板有更好的了解,会很想知道 cmets)
【问题讨论】:
-
我建议查看 XML 解析器。尝试使用正则表达式解析 HTML 是 generally discouraged。
-
@LewsTherin 但他没有解析 HTML?
-
@LewsTherin 我没有解析 HTML,我正在解析我自己的语法。
-
如何从 HTML 文档中提取数据不被视为解析?您需要能够区分您感兴趣的数据和 HTML 标记。我对解析的理解错了吗?
-
您可以正确匹配所有块与
(?s)\[if\s+(?<if>[^][]+)](?>(?:(?!\[if\s|\[end\ if]).)+|(?<close-open>)\[end\ if]|(?<open>)\[if\s+(?<if>[^][]+)])*(?(open)(?!))\[end\ if],但我对捕获内容有疑问。