$re = '/^Heading +(1).*(?:\r?\n(?! *Heading).*)*?\r?\n.*?SubheadingB: *(.*)/m';
$str = 'Heading -1
SubheadingB: SomethingBB
SubheadingC: SomethingCC
Heading 0
SubheadingA: SomethingDD
SubheadingB: SomethingEE
SubheadingC: SomethingFF
Heading 1
SubheadingA: SomethingX
SubheadingB: SomethingY
SubheadingC: SomethingZ
Heading 2
SubheadingA: SomethingGG
SubheadingB: SomethingHH
Heading 3
SubheadingA: SomethingJJ
SubheadingB: SomethingKK
SubheadingC: SomethingLL';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php