关于preg_match_all的抓取,该如何解决

关于preg_match_all的抓取
<div>
<h1>标题1</h1>
<p>内容1</p>
<p>内容2</p>
<h1>标题2</h1>
<p>内容1</p>
<p>内容2</p>
<p>内容3</p>
<p>内容4</p>
<h1>标题3</h1>
<p>内容1</p>
<p>内容2</p>
<p>内容3</p>
</div>


我要用preg_match_all()来循环获取从<h1>到下一个<h1>之前的内容即
<h1>标题1</h1>
<p>内容1</p>
<p>内容2</p>
------------
<h1>标题2</h1>
<p>内容1</p>
<p>内容2</p>
<p>内容3</p>
<p>内容4</p>
------------
<h1>标题3</h1>
<p>内容1</p>
<p>内容2</p>
<p>内容3</p>

我想过用
preg_match_all('/<h1>[\w\W]*<(h1|\/div)/U',$html, $out)

但这样抓,会隔一个就跳过,因为第二个的<h1>已经被第一个用了。

------解决方案--------------------
preg_match_all('/<div>(.*)<\/div>/is', $str, $m);
$m = explode('<h1>', substr($m[1][0], 5));
foreach($m as $x)
    echo htmlspecialchars ("<h1>$x") . '<br/>';