preg_match_all得到正确的"结束标记"

时间:2015-03-05 08:41:21

标签: php regex tags preg-match-all

我有一个小的BBCode系统正在使用preg_match_all来解析我的标签。 现在我的问题是我什么时候......像

[tab]

[tab_item id='tab' title='Titel']
Test Content
[/tab_item]

[tab_item id='tab2' title='Titel 2']
Test Content 2
[/tab_item]

[/tab]

我得到下一个结束标签。在这种情况下,我得到[tab]关闭标签[/ tab_item],而不是相同的命名标签[/ tab]。

这就是我的代码的样子:

    $pattern = "/\[(.*?) (.*?)](.*?)\[\/(.*?)\]/msi";
    preg_match_all($pattern, $article->text, $matches);

    $quotes = array();

    foreach($matches[2] as $id => $match)
    {

        preg_match_all('/(\w*?)=\'(.*?)\'/msi', $match, $attr_matches);

        echo $matches[1][$id]; //the first Tag [tab]
        echo $matches[4][$id]; //wrong closing Tag [/tab_item]


        $quote = array(
            'type'          =>  trim($matches[1][$id]),
            'text'          =>  trim($matches[3][$id]),
            'attr'    =>  array_combine($attr_matches[1], $attr_matches[2])
            );

        echo '<pre>'.print_r($quote,1).'</pre>';
    }

现在我的问题是,是否有可能在第一个preg_match_all中有一个变量,它表示这些变量必须相同?

2 个答案:

答案 0 :(得分:1)

\[(.*?)\]((?:(?!\[\/\1\])[\s\S])*)\[\/\1\]

您可以使用类似的内容在[tab][/tab]之间获取数据。请参阅演示。

https://regex101.com/r/eS7gD7/12

答案 1 :(得分:0)

我使用的模式与vks不同,但我认为两者都很好。

/\\[(.*?) (.*?)](.*?)\\[\\/\\1\\]/msi

主要不同的是,我也可以阅读像[blockqoute] [/ blockqoute]这样没有“subTag”的标签,我也可以从主标签中读取属性。

但这不是我要求的,而是我想要的东西。