[RegEx] Code verschachteln.

  • PHP

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von martinustreveri.

    [RegEx] Code verschachteln.

    Halloooo!

    Ich arbeite zzt. an einer Templateengine in PHP.
    Diese Engine hat eine eigene kleine Scriptsprache, um den Inhalt der gefüllten Templates etwas genauer zu kontrollieren.

    Ein Element ist der Controller:

    XML-Quellcode

    1. <controller([controllername])>Inhalt</controller>



    Der macht nichts anderes als eine Schnittstelle zwischen Template und Engine bereitzustellen.
    Im Script kann man einem Array Einträge hinzufügen.
    Wenn ein Controller dann im Start-Tag diesen Eintrag enthält, das Array aber nicht, wird der Controller samt Inhalt gelöscht. Wenn der Eintrag aber existiert, werden nur die Tags entfernt, das obige Beispiel würde also "Inhalt" ergeben.

    Soweit zur Theorie, in der Praxis habe ich folgendes Problem:

    Zum Auslesen der Controller benutze ich den regulären Ausdruck

    Quellcode

    1. /<controller\(([a-zA-Z0-9_-]+)\)>(.*)<\/controller>/isU


    Dürfte soweit klar sein, der Controllername darf nur aus a-z, 0-9 sowie _ und - bestehen und muss mindestens ein Zeichen lang sein.

    Das funktioniert auch perfekt mit nicht-verschachtelten Controllern wie im Beispiel oben.
    Wenn ich jetzt aber z.B. folgenden Code nutze:

    XML-Quellcode

    1. <controller(test)>
    2. A
    3. <controller(in_test)>
    4. <br />A-A
    5. </controller>
    6. </controller>
    7. <br />
    8. <controller(test2)>
    9. B
    10. </controller>


    Dann verschluckt preg_match bzw. preg_match_all immer den Close-Tag vom verschachtelten Controller (in_test), sodass ich folgendes Array erhalte:

    XML-Quellcode

    1. Array(
    2. [0] =>
    3. <controller(test)>
    4. A
    5. <controller(in_test)>
    6. <br />A-A
    7. </controller>
    8. [1] =>
    9. <controller(test2)>
    10. B
    11. </controller>
    12. )


    Das ist eigentlich auch schon alles.

    Schonmal Danke im Voraus,
    martinustreveri

    ~Edit: Wenn ich weitere Ebenen hinzufüge, bleibt immer nur ein Closetag übrig. Das hilft bei der Lösung des Problems auf jeden Fall, ich bin mir aber nicht genau sicher wie es hilft.

    ~Edit 2: Eine Möglichkeit wäre es schonmal, die Closetags genau so zu gestalten, wie die Starttags, z.B. <controller(a)></controller(a)>. Das ist allerdings aufwendig und sieht unschön aus.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „martinustreveri“ ()

    Ich würde fast behaupten, dass kannst du mit purem RegEx fast vergessen...
    frightanic.wordpress.com/2007/…ex-match-last-occurrence/

    Zum Laufen konnte ich es damit trotzdem nicht kriegen...
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.
    So, ich habe jetzt mal meine Cousin gefragt, der studiert Informatik und meint, dass ich diese "Sprache" mit regulären Ausdrücken garnicht interpretieren könnte, weil es eine kontextfreie Sprache ist, man mit RegEx allerdings nur reguläre Sprachen interpretieren könne (siehe Chomsky-Hierarchie). Wie einleuchtend.

    Auf jeden Fall muss ich jetzt alles mit einem Kellerautomaten machen. Also den kompletten Quelltext nach relevanten Codeschnipseln durchforsten, deren Inhalt dann über ne Rekursion durch alle Ebenen interpretieren und den interpretierten Inhalt wieder zurückschreiben.
    Yay!

    Thema hat sich insofern erledigt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „martinustreveri“ ()