preg_match_all 得到正确的 "end Tag"
preg_match_all get the right "end Tag"
我有一个小的 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 中设置一种变量,表示这些标签必须相同?
\[(.*?)\]((?:(?!\[\/\])[\s\S])*)\[\/\]
您可以使用类似这样的方法获取 [tab]
和 [/tab]
之间的数据。参见演示。
我使用的模式与 vks 不同,但我认为两者都很好。
/\[(.*?) (.*?)](.*?)\[\/\1\]/msi
主要区别在于,我也可以读取没有 "subTags" 的标签,例如 [blockqoute][/blockqoute],我也可以从主标签读取属性。
但这不是我想要的,而是我想要的。
我有一个小的 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 中设置一种变量,表示这些标签必须相同?
\[(.*?)\]((?:(?!\[\/\])[\s\S])*)\[\/\]
您可以使用类似这样的方法获取 [tab]
和 [/tab]
之间的数据。参见演示。
我使用的模式与 vks 不同,但我认为两者都很好。
/\[(.*?) (.*?)](.*?)\[\/\1\]/msi
主要区别在于,我也可以读取没有 "subTags" 的标签,例如 [blockqoute][/blockqoute],我也可以从主标签读取属性。
但这不是我想要的,而是我想要的。