Regulärer Ausdruck gesucht

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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

    Comment


    • #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]

      Comment


      • #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

        Comment


        • #5
          Originally posted by Piremilok View Post
          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!
          Last edited by unset; 30-05-2010, 18:31. Reason: Doppelpost

          Comment


          • #6
            Originally posted by tr-oo-per View Post
            ...

            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!

            Comment


            • #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]

              Comment


              • #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 . "/";

                Comment


                • #9
                  Originally posted by tr-oo-per View Post
                  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]

                  Comment


                  • #10
                    Originally posted by AmicaNoctis View Post
                    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

                    Comment


                    • #11
                      Originally posted by tr-oo-per View Post
                      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.
                      Last edited by fireweasel; 31-05-2010, 01:02.
                      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                      Comment


                      • #12
                        Originally posted by fireweasel View Post
                        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!

                        Comment

                        Working...
                        X