Php 如何在组中获取递归匹配?

Php 如何在组中获取递归匹配?,php,regex,Php,Regex,想象一下,我有以下字符串: $str = "[block]teststring [block]teststring123 [/block][/block]"; 我想获取[block]元素中的值(teststring,teststring123)。我知道我可以做一些事情,比如: <?php $str = "[block]teststring [block]teststring123 [/block][/block]"; $regex = '/\[block\]([^\[\]]+)/'

想象一下,我有以下字符串:

$str = "[block]teststring [block]teststring123  [/block][/block]";
我想获取[block]元素中的值(
teststring
teststring123
)。我知道我可以做一些事情,比如:

<?php
$str = "[block]teststring [block]teststring123  [/block][/block]";

$regex = '/\[block\]([^\[\]]+)/';
preg_match_all($regex, $str, $matches);
print_r($matches);
// outputs array(array("[block]teststring ", "[block]teststring123  "),
//               array("teststring ", "teststring123  "));
?>

只要整个字符串匹配,这就可以工作,但是我无法访问子匹配(
[block]teststring
[block]teststring123
)。如何通过PHP中的正则表达式实现这一点?

您可以使用此递归正则表达式:

\[block\]([^][]+)(?1)
(?1)
递归第一个子模式

代码:

$re = '~\[block\]([^][]+)(?1)~'; 
$str = "[block]teststring [block]teststring123  [/block][/block]"; 

preg_match_all($re, $str, $matches);
print_r($matches);

(?1)
(?R)
有什么不同?另外,我似乎需要在我的类中使用转义方括号。
(?R)
递归整个模式,但
(?1)
仅递归第一个子模式。相比之下,我不能使用
([^][+)
(未找到任何匹配项)。是的,正如我所说,您可以将它们转义为
([^\[\]+])
非常感谢-非常感谢!
$re = '~\[block\]([^][]+)(?1)~'; 
$str = "[block]teststring [block]teststring123  [/block][/block]"; 

preg_match_all($re, $str, $matches);
print_r($matches);