使用双括号捕获html标记样式语法的正则表达式

时间:2014-02-10 02:20:40

标签: php regex parsing syntax logic

我正在编写PHP中的另一个模板引擎。 Mustache.php应该真的是1.6mb ??我想要更轻,更完整的工作流程不可知。包含供应商文件并使用它的好时候发生了什么?

无论如何,语法很简单,我有一个非常简单的工作preg_replace工作简单的变量,即[[variable]]

然而,我遇到了一个问题,而我想要捕获封装的条件内容。即

[[#if this == 'that']] To be seen or not to be that is the question! [[/if]]

以下是我当前的正则表达式,非常接近,但我似乎无法找到关闭[[/if]]标记的正确规则;

它捕获了结束标记:(

preg_match('/\\[\\[#if(.+)\\]\\][^\\[\\]\\/](.+)\\[\\[\\/if\\]\\]/s', $template, $ifmatches);

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

This is my modification to your regex:

\[\[#(\w+)\s(.*?)\]\](.*?)\[\[\/\1\]\]

我所做的更改:

  • 我删除了“if”的文字文本,而是在1和无限次之间将其与短手字符类\w匹配。我将其放入一个反向引用号为1的捕获组。
  • 根据您的正则表达式,我在标记名称之后匹配了一个空格...然后匹配任何字符,0到无限次,尽可能少 (.*?)带有反向引用2号。
  • 标签之间的字符也与?量词匹配尽可能少,并放入反向引用3。
  • 在结束标记中,我使用反向引用来捕获组1,以便标记始终保持一致。

真正使这项工作更好的是?量词。它将表达“懒惰”变成了一件好事,因为它并没有“超越”。

以下是演示如何运作的演示:

  

'?' Quantifier demonstration