Andü: Negierter Sring in Regulärem Ausdruck

Hallo.

Ich habe für ein Projekt eine Template-Engine geschrieben. Die Templates sehen in etwa so aus...

<body>
{varibale0}
{START bereich1}
{varibale1}
<b>{varibale2}</b>
{END bereich1}
</body>

Jetzt möchte ich die Bereiche und Variablen in einen Array einlesen, wobei jede Variable untergeordnet zu ihrem Bereich ist (wird rekursiv gemacht). In etwa so:

Array
(
  [bereich1] => Array
  (
    [0] => variable1
    [1] => variable2
  )
  [0] => variable0
)

Die Bereiche lese ich so aus, das funktioniert auch:

preg_match_all ("/{START (.+)}(.*){END \1}/Us", $template, $areas, PREG_SET_ORDER);

Jetzt will ich aber eben noch zu dem Bereich die entsprechenden Variablen. Da ist das Porblem, weil der immer alle Variablen einliest. Ich hab es so versucht, funktionierte aber nicht:

preg_match_all ("/({?!START (.+)}.*){(?!START |END )(.+)}(?!.*{END \1})/Us", $template, $vars);

Da entsteht in etwa sowas:

Array
(
  [bereich1] => Array
  (
  )
)

Hat jemand die Lösung für dieses Problem?

Gruß, Andü

  1. Da ist das Porblem, weil der immer alle Variablen einliest.

    Sorry, sollte so heißen:
    Da ist das Porblem, dass der keine Variablen einliest.

    1. Jippie, ich hab das Problem selbst gelöst. Aber ein kleines Problem bleibt noch. Ich mach es jetzt so:

      preg_match_all ("/(?!.*{START (.+)}.*){(?!START |END )(.+)}(?!.*{END \1}.*)/Us", $template, $vars);

      So in etwa das Template:

      <body>
      {varibale0}
      {START bereich1}
      {varibale1}
      <b>{varibale2}</b>
      {START bereich2}
      {varibale3}
      {END bereich2}
      {START bereich3}
      {varibale4}
      {END bereich3}
      {END bereich1}
      </body>

      Jetzt kommt in etwa das raus:

      Array
      (
        [bereich1] => Array
        (
          [bereich2] => Array
          (
            [0] => variable3
          )
          [bereich3] => Array
          (
            [0] => variable4
          )
          [0] => variable1
          [1] => variable2
          [2] => variable4
        )
      )

      Sprich, den ersten "Unterbereich" macht er richtig, aber bei den folgenden werden die variablen wieder durchgeschleift. Außerdem werden die Variablen, welche sich in keinem Bereich befinden auch nicht eingelesen!

      1. gudn tach!

        preg_match_all ("/(?!.*{START (.+)}.*){(?!START |END )(.+)}(?!.*{END \1}.*)/Us", $template, $vars);

        allein der anfang, also /(?!.*{START (.+)}.*)/ sieht nach unsinn aus.
        negative look-aheads am _anfang_? willst du das wirklich?

        So in etwa das Template:

        <body>
        {varibale0}
        {START bereich1}
        {varibale1}
        <b>{varibale2}</b>
        {START bereich2}
        {varibale3}
        {END bereich2}
        {START bereich3}
        {varibale4}
        {END bereich3}
        {END bereich1}
        </body>

        sobald es um verschachtelte "dinger" geht, bist du mit regexp i.a.r. regel aufgeschmissen, es sei denn du kennst apriori den maximalen verschachtelungsgrad. kennst du ihn?

        ich empfehle dir, nicht zu versuchen, das mit genau regexp erledigen zu wollen. in php gibt's bestimmt auch tolle "parser"-module. ansonsten sollte es auch mit gewoehnlichen string-funktionen gehen unter zuhilfenahme einiger preg_dinger.

        prost
        seth