[REGEX] Regex mit 2 Variablen - Parser wird gierig

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

  • [REGEX] Regex mit 2 Variablen - Parser wird gierig

    Ich möchte folgendes ersetzten (außenrum steht natürlich noch anderer Text):

    {$var|modifier}

    Allerdings bekomme ich das pattern dafür einfach nicht hin. Mein bisheriger Versuch ist:

    PHP-Code:
    #{\$(.+?)\|(.+?)}#Uis 
    Allerdings wird dann der Parser immer "gierig" und nimmt einen viel zu großen Text zum erstzen.
    daniel-portal.com/games Free Games and more

  • #2
    Re: [REGEX] Regex mit 2 Variablen - Parser wird gierig

    #{\$(.+)\|(.+)}#Uis

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Danke für deine antwort, funktioniert so aber leider immer noch nicht der Parser weitet die Klammer weiterhein bis aufs maximum aus.
      daniel-portal.com/games Free Games and more

      Kommentar


      • #4
        Original geschrieben von daniel987
        Danke für deine antwort, funktioniert so aber leider immer noch nicht der Parser weitet die Klammer weiterhein bis aufs maximum aus.

        Ich finde er funktioniert Oo
        http://pcre.nophia.de/evaluate/65a25...dex.php#output

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          Naja der Ausdruck scheint aber nicht immer zu funktionieren, ich füge mal ein Stück von meinem Originalcode ein dann siehst du was ich meine.

          http://pcre.nophia.de/evaluate/5be18...dex.php#output
          daniel-portal.com/games Free Games and more

          Kommentar


          • #6
            Dir ist doch eigentlich klar, wo das Problem liegt, oder?

            Der Parser sucht sich die erste klammer und schnappt sich alles bis zur ersten schließenden klammer, die nach einer Pipe kommt. Das hat mit gierig nichts zu tun.

            Wenn der erste "Parameter" in deinem Platzhalter keine Leerzeichen enthalten kann/darf, was ich denke, dann reicht es, wenn du im Pattern an der entsprechenden Stelle die Leerzeichen ausschließt.

            Noch besser ist natürlich, wenn du den ersten parameter ausschlißlich auf Variablen abstimmst. Vorrausgesetzt das lässt sich mit deinem Vorhaben vereinbaren.
            Zuletzt geändert von TobiaZ; 16.09.2005, 09:59.

            Kommentar


            • #7
              PCRE regex syntax
              ...
              If the PCRE_UNGREEDY option is set (an option which is not available in Perl) then the quantifiers are not greedy by default, but individual ones can be made greedy by following them with a question mark. In other words, it inverts the default behaviour.
              ...
              Ergo: Nimm das U weg und beide Teilausdrücke werden ungierig.

              Alternativ: Ersetze ".+?" durch ".*"
              Noch alternativer: #\{\$?(.*)\}#Uis
              mein Sport: mein Frühstück: meine Arbeit:

              Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

              Kommentar


              • #8
                Hm also ich hab jetzt mal beide Beispiele ausprobiert, allerdings klappt es damit immer noch nicht, das erst Liefert genau dasselbe Ergebniss wie bisher und das zweite Liefert nur die { } ohne | in der Mitte.

                @TobiaZ ja mir war schon klar wo das Problem liegt allerdings hab ich nirgends was dazu gefunden wie man Leerzeichen verbieten kann, ich hab jetzt auch mal den s Modifier entfernt somite beschränkt sich der gefunden Berreich nur noch auf die erste Zeile.
                daniel-portal.com/games Free Games and more

                Kommentar


                • #9
                  ah oh ... fehlgelesen ... die Pipe-Symbol (Sonderzeichen!!!) muss escaped werden.

                  also "noch alternativer" streichen!

                  Nebenbei: Die Modifier i und s kannst du dir schenken:
                  - i weil "\w" bzw. "." sowieso schon case-insensitiv sind.
                  - s weil der gesuchte Text wohl kaum einen Zeilenumbruch beinhaltet.


                  "$var" ist wohl immer da
                  nur: ist "|modifier" auch immer vorhanden?

                  wenn ja: [color=seagreen]#\{\$(\w+)\|(\w+)\}#U[/color] => $1='var', $2='modifier'
                  wenn nicht: [color=seagreen]#\{\$(\w+)\(|(\w+))?\}#U[/color] => $1='var', $3='modifier' (oder nicht vorhanden)


                  Wichtig: Das Fragezeichen wenn überhaupt dann _hinter_ die Klammern und nicht ans Ende dazwischen! (sonst passiert --> siehe quote oben)
                  mein Sport: mein Frühstück: meine Arbeit:

                  Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

                  Kommentar


                  • #10
                    Danke der erste funktioniert, zwar ist der 2 Parameter nicht immer vorhanden, aber dann soll auch gar nichts gefunden werden. Somit ist die erste Lösung perfekt.
                    daniel-portal.com/games Free Games and more

                    Kommentar

                    Lädt...
                    X