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);