Regulärer Ausdruck gesucht

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Regulärer Ausdruck gesucht

    Folgendes Problem: ich möchte eine Zeichenkette hinsichtlich gepaarter Ausdrücke durchsuchen.

    Code:
    $string = "
        {begin:section1}
        Text
        {end:sectionX1}
        Text
        {begin:section2}
            Text
            {begin:section21}
                Text
            {end:section21}
             Text
        {end:section2}
        Text
    ";
    $pattern = ???;
    $matches = array();
    $n = preg_match_all($pattern, $string, $matches);
    Ich kenne die Namen im Vornherein nicht, kann mich bestenfalls auf die Teilstrings "begin:" und "end:" verlassen.

    Gruß,
    tr-oo-per

  • #2
    Hi,

    wenn du selbst die Namen nicht genau kennst, dann würde ich erstmal eine Suche nach den Namen durchführen und anschließend für jeden Namen ein eigenes Pattern generieren.
    Zur Optimierung kannst du ja dann bereits durchlaufene Patterns über eine Liste ausschließen, sodass sie nicht erneut ausgeführt werden.

    Beispiel für das 1. Pattern um die Namen herauszufinden:
    PHP-Code:
    $pattern "!\{begin:(.*?)\}!si"
    Das 2. solltest du anhand meiner Infos selbst zusammenbasteln können...

    gruß
    Piremilok

    Kommentar


    • #3
      Hallo,

      ein vielleicht etwas weit hergeholter, aber bei steigender Komplexität vielleicht nicht schlechter Vorschlag:

      PHP-Code:
      preg_replace("<\\{begin:(\\w+)\\}>""<\\1>"$string);
      preg_replace("<\\{end:(\\w+)\\}>""</\\1>"$string); 
      Danach kann man das Ganze per DOM verarbeiten und damit auch Helferlein wie XPath nutzen.

      Gruß,

      Amica
      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
      Super, danke!
      [/COLOR]

      Kommentar


      • #4
        Wenn ich ehrlich bin, dachte ich mir direkt, dass es sinniger wäre, die Syntax leicht zu modifizieren, um dann entsprechend mit den Klassen dran zu gehen.
        [FONT="Helvetica"]twitter.com/unset[/FONT]

        Shitstorm Podcast – Wöchentliches Auskotzen

        Kommentar


        • #5
          Zitat von Piremilok Beitrag anzeigen
          wenn du selbst die Namen nicht genau kennst, dann würde ich erstmal eine Suche nach den Namen durchführen und anschließend für jeden Namen ein eigenes Pattern generieren.
          Danke für Deinen Vorschlag. So mache ich es im Moment auch, aber es wäre schön, wenn es dafür ein Suchmuster gibt, so dass ich alle Treffer mit einem preg_match_all-Aufruf bekomme. Beispielsweise:

          Code:
          $begin = "\\{begin:(.*)\\}";
          $end = "\\{end:(.*)\\}";
          $pattern = "/$begin(.*)$end/";
          Jetzt ist meine Frage: kann ich $end umformulieren, um zu fordern, dass der Name der selbe ist, wie der innerhalb von $begin ermittelte?

          @Amica: Thx, damit kann ich etwas anfangen!
          Zuletzt geändert von unset; 30.05.2010, 18:31. Grund: Doppelpost

          Kommentar


          • #6
            Zitat von tr-oo-per Beitrag anzeigen
            ...

            Code:
            $begin = "\\{begin:(.*)\\}";
            $end = "\\{end:(.*)\\}";
            $pattern = "/$begin(.*)$end/";
            Jetzt ist meine Frage: kann ich $end umformulieren, um zu fordern, dass der Name der selbe ist, wie der innerhalb von $begin ermittelte?
            Sagt dir das Stichwort "back reference" etwas?
            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

            Kommentar


            • #7
              Du musst das lazy (also non-greedy) matchen, also „.*?“ statt „.*“.
              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
              Super, danke!
              [/COLOR]

              Kommentar


              • #8
                Kurz bevor der Hinweis kam, habe ich eine Backreference eingebaut. Jetzt stehe ich vor dem Problem, dass im Falle von Schachtelungen die inneren Sektionen nicht gefunden werden (im obigen Beispiel wäre das "section21").

                Es macht derzeit keinen Unterschied ob ich greedy oder non-greedy matche, aber ich hab den Vorschlag an den betreffenden Stellen vorsichtshalber übernommen.

                Code:
                $begin = "\\{begin:(.*?)\\}";
                $end = "\\{end:\\1\\}";
                $pattern = "/" . $begin . ".*?" . $end . "/";

                Kommentar


                • #9
                  Zitat von tr-oo-per Beitrag anzeigen
                  Jetzt stehe ich vor dem Problem, dass im Falle von Schachtelungen die inneren Sektionen nicht gefunden werden
                  Dann ist vielleicht mein DOM-Hinweis doch was für dich?
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Kommentar


                  • #10
                    Zitat von AmicaNoctis Beitrag anzeigen
                    Dann ist vielleicht mein DOM-Hinweis doch was für dich?
                    Ich lass es noch auf ein paar Versuche mit dem Backreference-Ansatz ankommen. Wenn das nichts wird, werd ich auf Deinen Vorschlag zurückkommen, ganau

                    Kommentar


                    • #11
                      Zitat von tr-oo-per Beitrag anzeigen
                      Kurz bevor der Hinweis kam, habe ich eine Backreference eingebaut. Jetzt stehe ich vor dem Problem, dass im Falle von Schachtelungen die inneren Sektionen nicht gefunden werden (im obigen Beispiel wäre das "section21"). ...
                      Sagt dir das Stichwort "recursive subpatterns" etwas?

                      Das lesenswerte PHP-Handbuch hat eine ganze Seite dazu.
                      Zuletzt geändert von fireweasel; 31.05.2010, 01:02.
                      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                      Kommentar


                      • #12
                        Zitat von fireweasel Beitrag anzeigen
                        Sagt dir das Stichwort "recursive subpatterns" etwas?
                        Hab gehofft dass es etwas derartiges gibt, aber nichts gefunden. Das bringt mich der Sache ein Stück näher, danke!

                        Kommentar

                        Lädt...
                        X