【发布时间】: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