Si, tiene que ser tanto las variable como el texto, pero creo que me he explicado fatal. Cogeré tu ejemplo que me viene de perla, si el texto es el siguiente no lo hace bien.
Código PHP:
$str1 = '<p>texto texto texto texto</p>
<!-- IF var1 --><p>Texto <!-- IF var2 -->condicionado<!-- END IF --></p><!-- END IF -->
<p>texto texto texto texto</p>';
$pattern = '/<!-- IF (.*?) -->(.*?)<!-- END IF -->/';
preg_match_all($pattern, $str1, $matches, PREG_SET_ORDER);
echo htmlentities($str1);
echo '<br />';
echo htmlentities($pattern);
echo '<pre>';
print_r($matches);
echo '</pre>';
Al haber 2 IF's imbricados (uno dentro de otro), este patrón cogería tan solo
<!-- IF var1 --><p>Texto <!-- IF var2 -->condicionado<!-- END IF -->. Y debería haber cogido también el último
END IF ya que es el cierre del primer
IF.
Me hace falta que sepa cuantas veces se ha abierto un tag y solo detecte cuando haya detectado también las mismas veces el tag de cierre.