Ti posto innanzitutto il codice completo che ho usato per il test:
Codice PHP:
$testo = <<<EOD
<div id=visi style="display:none;">
Bla bla bla blabla
bla bla bla bla bla
</div>
<div id=visi style="display:none;">
Bla bla bla blabla
bla bla bla bla bla
</div>
EOD;
$nuovotesto = preg_replace('%(<div id=visi style="display:none;">)(.*?)(</div>)%si', '$1$3', $testo);
(e dagli con gli spazi, chissà perchè me li aggiunge!
)
Il punto è proprio quello della tua ultima domanda: se tolgo $1$3 mi sostituisce tutto, se invece lascio $1 e $3 allora mi sostituisce solo il contenuto.
Invece di togliere $1$3, prova al limite a sostituirlo con \$1\$3