<?php
$s = <<<INPUT
[startA]
this is the first group
[startB]
blabla
[end]
[end]
[startA]
this is the second group
[startB]
blabla
[end]
[end]
[startA]
this is the second group
[startB]
blabla
[end]
[end]
INPUT ;
preg_match_all ( '/\[(?!end)[^[\]]+\](?:[^[\]]*|[^[\]]*(?R)[^[\]]*)\[end\]\s*/' , $s , $m ) ; foreach ( $m [ 0 ] as $match ) print "$match \n " ;
?>
PD9waHAKJHMgPSA8PDxJTlBVVApbc3RhcnRBXQp0aGlzIGlzIHRoZSBmaXJzdCBncm91cAogW3N0YXJ0Ql0KIGJsYWJsYQpbZW5kXQpbZW5kXQpbc3RhcnRBXQp0aGlzIGlzIHRoZSBzZWNvbmQgZ3JvdXAKIFtzdGFydEJdCiBibGFibGEKW2VuZF0KW2VuZF0KW3N0YXJ0QV0KdGhpcyBpcyB0aGUgc2Vjb25kIGdyb3VwCiBbc3RhcnRCXQogYmxhYmxhCltlbmRdCltlbmRdCklOUFVUOwpwcmVnX21hdGNoX2FsbCgnL1xbKD8hZW5kKVteW1xdXStcXSg/OlteW1xdXSp8W15bXF1dKig/UilbXltcXV0qKVxbZW5kXF1ccyovJywgJHMsICRtKTsKZm9yZWFjaCAoJG1bMF0gYXMgJG1hdGNoKSBwcmludCAiJG1hdGNoXG4iOwo/Pg==