使表达式对嵌套元素递归

时间:2019-02-12 10:12:43

标签: php regex

我有一个简单的模板系统,正则表达式捕获了一些特殊标签,例如if条件。 现在我需要在if条件中包含一个if条件,并且当前表达式在第一个if-endtag处中断。

我尝试了(?R)和其他一些方法,但是要么括号内没有任何HTML标记,要么它们在第一个/#if

处中断了。
{{{#if(.*?)}}}(.*?){{{\/#if}}}

和我的HTML代码

{{{#if:header:!=:}}}
    <div class="header">
        <h1>
                {{{header}}}
                {{{#if:header_bar:!=:}}}
                    <div class="headbuttons">
                        {{{header_bar}}}
                    </div>
                {{{/#if}}}
            </h1>
        </div>
    {{{/#if}}}

预期从#if:header:!=:}}}的第一个返回到第二个/#if

有人可以帮我完成这项工作吗?

1 个答案:

答案 0 :(得分:0)

  

我尝试过(?R)…

import { AuthConsumer } from '../AuthContext'; import Welcome from './Welcome'; import Initial from './Initial'; export default ({ user, children }) => ( <AuthConsumer> {({ user }) => ( <div css={headerStyles}> <div> <Welcome name={user.name} /> <Initial name={user.name} /> </div> {children} </div> )} </AuthConsumer> ); 有效;除了简单的if-body (?R)以外,我们可以在一侧使用递归模式(.*?),在另一侧使用简单模式.*?(?R).*?的替代方式:.*?。样本:

(.*?(?R).*?|.*?)

输出:

preg_match('/{{{#if(.*?)}}}(.*?(?R).*?|.*?){{{\/#if}}}/s', '
{{{#if:header:!=:}}}
    <div class="header">
        <h1>
                {{{header}}}
                {{{#if:header_bar:!=:}}}
                    <div class="headbuttons">
                        {{{header_bar}}}
                    </div>
                {{{/#if}}}
            </h1>
        </div>
    {{{/#if}}}', $matches);
echo $matches[0], "\n";