Manchmal ist es einfacher als man denkt.
Zu . gehört standardmäßig nicht der Zeilenumbruch.
Einfach den Modifier s hinzuüfgen. So werden auch Zeilenumbrüche als . erkannt.
preg_match_all("#{if[start]}(.*?){if[ende]}#s", $String, $Array);
Grüße aus dem Wald
Voodoo