言明 (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"; } ?>