dom will only work though if the HTML is valid as XML. most online is not valid HTML let alone XML, because most webmasters are fucktards.
The ? actually means repeat the prior capture, non-greedy.
so something like this
<div>test</div><div>test2</div>
#<div>(.*)</div>#s will output: test</div><div>test2
#<div>(.*?)</div>#s will output: test or an array with test and test2 in it depending if you use preg_match_all
BTW, I use # symbols instead of / as my end caps so I dont have to escape slashes

The other option frankly is to not do regex the way you are trying which is in one shot. You can't for a couple of reasons.
I assume that the target content is "not predictable" in its structure? If it is, then you can make a single pattern. If not, you will probably need to do multistep. Realize that you could accomplish the same exact things by removing stuff.
preg_replace is your friend.

$arr = preg_split('#</body.*?>#is',$fullhtmlpage);
$a = $arr[0];
//delete contents of these tags
$a = preg_replace('#<style.*?>.*?</style>#is',' ',$a);
$a = preg_replace('#<script.*?>.*?</script>#is',' ',$a);
$a = preg_replace('#<form.*?>.*?</form>#is',' ',$a);
$a = preg_replace('#<!--.*?-->#is',' ',$a);
$a = preg_replace('#<!--.*?-->#is',' ',$a);
$a = preg_replace('#<img.*?>#is',' ',$a);
$a = preg_replace('#<br>#is',' ',$a);
$a = preg_replace('#<br />#is',' ',$a);
$a = preg_replace('#<br/>#is',' ',$a);
$a = preg_replace('#<p.*?>#is',' ',$a);
$a = preg_replace('#</p.*?>#is',' ',$a);
$a = str_replace(' ',' ',$a);
$a = preg_replace('#<.+?>#si',' ',$a); //strip remaining tags, like custom XML
$a = preg_replace('#\s#is',' ',$a);
$a = preg_replace('# {1,}#is',' ',$a);
$pileofsentencesforyoutobreakaparthowyouwish = trim($a);