【问题标题】:preg_match_all get the right "end Tag"preg_match_all 获得正确的“结束标签”
【发布时间】:2015-03-05 08:41:20
【问题描述】:

我有一个小 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 中有一种变量表示这些到标签必须相同?

【问题讨论】:

  • 预期输出是什么
  • 我想获取 [tab] 和 [/tab] 标记之间的全部内容,以便我可以再次 preg_match_all 内容以过滤选项卡项...
  • 已经有很多 PHP 的 BBCode 库了,你有什么特别的理由不只使用其中一个吗?
  • 只是为了学习和理解preg_match_all机制

标签: php regex tags preg-match-all


【解决方案1】:
\[(.*?)\]((?:(?!\[\/\1\])[\s\S])*)\[\/\1\]

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

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

【讨论】:

  • 谢谢你很好! :) 我采用了一种不同的模式,它也可以读取主标签中的属性。稍后将发布此作为答案
【解决方案2】:

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

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

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

但这并不是我想要的,而是我想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多