如何在组中抓取递归匹配?

时间:2015-12-15 20:32:29

标签: php regex

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

$str = "[block]teststring [block]teststring123  [/block][/block]";

我想获取[block]元素(teststringteststring123)中的值。我知道我可以做某事。像:

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

然而,随着我对正则表达式的学习越来越多,我想到了使用递归:

$regex = '/\[block\]([^\[\]]+)(?R)?/';

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

1 个答案:

答案 0 :(得分:1)

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

\[block\]([^][]+)(?1)

(?1)递归第一个子模式。

RegEx Demo

<强>代码:

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

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