Das Problem an der Funktion sind im Prinzip die Verschachtelungen. Ich habe mich da auch schon mal sehr intensiv mit beschäftigt und habe mit preg_match_all oder ähnlichen Funktionen keine Möglichkeit gefunden die Verschachtelung korrekt zu erkennen.
Wie du vorgehen musst hängt ganz davon ab was du genau willst. Wenn du (um bei deinem Beispiel zu bleiben) xy genau kennst (also genau weißt wonach du suchst) und es nur ein mal vorkommt kannst du ja einfach
Code: Alles auswählen
$inhalt = preg_replace('#(.*?)<!-- BEGIN '.$wert_von_xy .' -->(.*?)<!-- END '.$wert_von_xy .' -->(.*?)#s','\\2', $alles_zusammen);
verwenden.
Ich würde allerdings eine Suche mit PREG_PATTERN_ORDER bevorzugen:
Code: Alles auswählen
preg_match_all('|<!-- BEGIN '.$name.' -->(.*?)<!-- END '.$name.' -->|s', $this->content, $blocks, PREG_PATTERN_ORDER);
Die Inhalte findest du dann in $blocks[1][$i]
Dein Beispiel enthält auch einen Fehler: *.* sucht nach * und dann beliebigen Zeichen, dein zweites Beispiel ist besser (außer dass die Leerzeichen eventuell stören könnten), allerdings ist dieses Beispiel "gierig", d.h. wenn du eine Konstruktion wie diese hast:
Code: Alles auswählen
<!-- BEGIN hallo --> Testtext 1 <!-- END hallo -->
<!-- BEGIN hallo --> Testtext 2 <!-- END hallo -->
Dann wird dir dein Muster als Inhalt das hier ausspucken:
Code: Alles auswählen
Testtext 1 <!-- END hallo -->
<!-- BEGIN hallo --> Testtext 2
Mein Vorgehen war:
- per preg_match_all erst mal alle Blöcke erkennen (Anfang und Ende)
- Das ganze dann durch php-Code ersetzen den man ja dann ausführen kann.