- var_dump: documentation ( source)
- preg_match_all: documentation ( source)
<?php
$pattern = "/(?(DEFINE)(?<p1>BEGIN)(?<p2>END))((?&p1)|(?&p2))+/";
$subject = <<<EOF
BEGIN
something();
BEGIN
if (false) echo "e";
END
END
EOF;
$count = preg_match_all($pattern, $subject, $matches);
var_dump($count, $matches);