用递归php找到正则表达式


Find regex with recursive php

我需要找到跟随字符串的正则表达式,并获得所有制表符父:

{jmstabs type="horizontal" theme="two" nav="left"}
       [tab title="Tab title 1"]Tab content 1[/tab]
       [tab title="Tab title 2"]Tab content 2[/tab]
       [tab title="Tab title 3"]
            {jmstabs}
               [tab title="Tab child 1"]Tab child 1[/tab]
               [tab title="Tab child 2"]Tab child 2[/tab]
            {/jmstabs}
       [/tab]
{/jmstabs}

我想得到preg_match_all后的结果:

 1. [tab title="Tab title 1"]Tab content 1[/tab]
 2. [tab title="Tab title 2"]Tab content 2[/tab]
 3. [tab title="Tab title 3"]
        {jmstabs}
             [tab title="Tab child 1"]Tab child 1[/tab]
             [tab title="Tab child 2"]Tab child 2[/tab]
        {/jmstabs}
    [/tab]

请帮帮我!谢谢大家。

你可以使用这个模式:

(?(DEFINE)
    (?<item>'s*(?:(?&curly)|(?&square))|[^'['{]*)
    (?<attr>'s+'w+="[^"]*")
    (?<curly>'{('w+)(?&attr)*'}(?&item)*'{'/'w+'})
    (?<square>'[('w+)(?&attr)*'](?&item)*'['/'w+'])
)'[tab(?&attr)*'](?&item)*'['/tab']

在线演示。

感谢@Rawing的正则表达式模式;下面是如何使用它们。和…顺便说一下;您可以在这里查看演示:

<?php
    $str = '{jmstabs type="horizontal" theme="two" nav="left"}
               [tab title="Tab title 1"]Tab content 1[/tab]
               [tab title="Tab title 2"]Tab content 2[/tab]
               [tab title="Tab title 3"]
                   {jmstabs}
                        [tab title="Tab child 1"]Tab child 1[/tab]
                        [tab title="Tab child 2"]Tab child 2[/tab]
                    {/jmstabs}
                [/tab]
            {/jmstabs}';
    preg_match_all("#(?(DEFINE)
                    (?<item>'s*(?:(?&curly)|(?&square))|[^'['{]*)
                    (?<attr>'s+'w+='"[^'"]*'")
                    (?<curly>'{('w+)(?&attr)*'}(?&item)*'{'/'w+'})
                    (?<square>'[('w+)(?&attr)*'](?&item)*'['/'w+'])
                )'[tab(?&attr)*'](?&item)*'['/tab']#", $str, $matches);

    var_dump( $matches[0] );
    // PRODUCES:::
    array (size=3)
          0 => string '[tab title="Tab title 1"]Tab content 1[/tab]' (length=44)
          1 => string '[tab title="Tab title 2"]Tab content 2[/tab]' (length=44)
          2 => string '[tab title="Tab title 3"]
                           {jmstabs}
                                [tab title="Tab child 1"]Tab child 1[/tab]
                                [tab title="Tab child 2"]Tab child 2[/tab]
                            {/jmstabs}
                        [/tab]' (length=211)