【问题标题】:Regular expression to capture html tag style syntax using double brackets使用双括号捕获 html 标记样式语法的正则表达式
【发布时间】:2014-03-07 05:52:19
【问题描述】:

我正在用 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);

任何帮助将不胜感激!

【问题讨论】:

    标签: php regex parsing syntax logic


    【解决方案1】:

    This is my modification to your regex:

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

    我所做的更改:

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

    真正让这项工作更好的是? 量词。它将表达变成“懒惰”,这是一件好事,因为它不会“过度”。

    这是一个演示它是如何工作的:

    '?' Quantifier demonstration

    【讨论】:

    • 您好 Vasili,不确定谁否决了您的答案,但如果可以的话,我会投赞成票(还没有足够的声誉)。您的正则表达式完美运行,并且绝对写得更优雅!我的正则表达式令人窒息,请参阅here。我仍然不确定我哪里出错了?但是非常感谢您的帮助:) P.s 感谢您向我介绍 regex101.com.. 惊人的实用程序。
    • 没问题。既然它起作用了,我会写更多关于我的正则表达式是如何工作的。只要有可能就投票并接受答案,没什么大不了的。大多数人对与 HTML 或 XML 相关的任何问题都投反对票,因为一些狂热者认为永远不应该使用正则表达式。
    • 顺便说一句,根据您的问题,表达式是否需要将所有 \ 字符转义两次?
    • 有趣的是双反斜杠。我以前从未使用过它,但看到它被用在几个 php 正则表达式中,包括 WordPress 用于他们的简码的那个,并且迫切需要一个解决方案,我把它们扔在那里。有点奇怪,我更喜欢它们!再次感谢您的帮助,一旦我能够投票,我一定会投赞成票
    猜你喜欢
    • 2015-01-20
    • 2013-10-31
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2020-02-21
    • 1970-01-01
    相关资源
    最近更新 更多