言明 (assertion) <(?!\\1) のところがミソです。
このコードで言うと、<div>~~<div>~~</div>はマッチしませんが、<div>~~<br>~~</div>はマッチします。
(?: ... ) の部分はキャプチャの対象外になります。$matches に値として格納されません。
<?php
$str =<<<_STR_
z1<br>z1-2
<div id="a">
a1<br>a1-2
<div id="b">
b1<br>b1-2
<div id="c">c1<br>c1-2<br>
c1-3</div>
b2<br>b2-2
</div>
a2<br>a2-2
</div>
z2<br>z2-2
<div id="d">
d1-d1-2
</div>
z3<br>z3-2
_STR_;
if(preg_match_all('/<(\w+)[^>]*>([^<>]*(?:<(?!\\1)[^>]*>[^<>]*)*?)<\/\\1>/is',$str,$matches)){
print_r($matches);
}else{
print "Unmatch\n";
}
?>