Problem mit Regex Ausdruck

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

  • Problem mit Regex Ausdruck

    Hallo zusammen,

    habe (wie so oft) mal wieder ein Problem mit einem Regulären Ausdruck.

    Ich habe einen Text in dem folgendes rausgefiltert werden muss:

    PHP-Code:
    XYZ... {{BeginnExportPublicSection}}XYZ..Alle Zeichenerlaut{{EndExportPublicSection}} ...XYZ 
    Ich dachte es geht mit dieser Regex, nur leider wird hier nichts entfernt.

    PHP-Code:
    $suchstring='/\{\{BeginnExportPublicSection\}\}(.*)\{\{EndExportPublicSection\}\}/';
    $resultpreg_replace($suchstring,'',$result); 
    stell mich wohl etwas dumm an
    Zuletzt geändert von Buddy; 26.05.2010, 19:52.

  • #2
    Zitat von Buddy Beitrag anzeigen
    stell mich wohl etwas dumm an
    Ja, absolut.

    Und zwar insb. damit, dass deine Problembeschreibung im wesentlichen nur „funzt nich“ lautet; und das sogar der Tatsache zum Trotz, dass das gezeigte Suchmuster per preg_match auf den gezeigten Text angewandt "XYZ..Alle Zeichenerlaut" als Treffer liefert.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Ok, bin dem Probelm näher gekommen, und zwar sind im originalstring zeilenumbrüche enthalten(waren bei dem bsp. string nicht drin, deswegen der match bei dir).

      hier originalauszug aus dem zu durchsuchenden string:

      PHP-Code:
      ...<p>{{BeginnExportPublicSection}}  
      Ich soll öffentlich sein.
      {{
      EndExportPublicSection}}
      </
      p>... 
      können unendlich viele zeilenumbrüche sein, nur wie bringe ich das meinen regex bei?

      Kommentar


      • #4
        RTFM: PHP: Full stop - Manual
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          "rtfm" wenn ich schon sowas less, bekomm ich schon wieder ein deutliches zeichen, das manche leute einfach nichts in nem forum antworten sollten..
          ein einfaches "hey häng och ein '/s' an, das matched dir auch die zeilenumbrüche" hätte es schon getan. wenn man ein problem hat und in einem forum fragt deutet das doch meist darauf hin, das man es selber nicht hinbekommt, und wahrscheinlcih shcon am kotzen ist. da wäre doch eine einfache antwort nicht zuviel.. vorallem wenn man sie weiß.. trotzdem danke..

          Kommentar


          • #6
            Hallo,

            mit „.*?“ statt „.*“ matcht es nicht gierig. Ansonsten würde es bei mehreren Vorkommen zuviel entfernen.

            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


            • #7
              Zitat von AmicaNoctis Beitrag anzeigen
              Hallo,

              mit „.*?“ statt „.*“ matcht es nicht gierig. Ansonsten würde es bei mehreren Vorkommen zuviel entfernen.

              Gruß,

              Amica
              super, danke!

              Kommentar


              • #8
                [COLOR=#000000][COLOR=#cc0000][COLOR=Black]
                Code:
                $pattern = "/\{.*\{.*BeginnExportPublicSection.*\}.*\}(.*)\{.*\{.*EndExportPublicSection.*\}.*\}/i";
                sollte das gewünschte leisten.

                Falls nicht, versuch mal "BeginnExportPublicSection" in "BeginExportPublicSection" umzuwandeln (ein 'n' streichen). Klingt arg nach Denglisch.
                [/COLOR][/COLOR][/COLOR]

                Kommentar


                • #9
                  Zitat von tr-oo-per Beitrag anzeigen
                  [COLOR=#000000][COLOR=#cc0000][COLOR=Black]
                  Code:
                  $pattern = "/\{.*\{.*BeginnExportPublicSection.*\}.*\}(.*)\{.*\{.*EndExportPublicSection.*\}.*\}/i";
                  sollte das gewünschte leisten.
                  Nein, das leistet etwas ganz anderes, falls es überhaupt etwas sinnvolles leistet.
                  [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
                    @AmicaNoctis: etwas ganz anderes? erklär mal bitte oder biete eine Lösung an ... ich mach Deine Beiträge ja auch nicht grundlos madig!

                    Man könnte die von mir eingefügten '.*' durch '[\s\t\n\r]*' ersetzen, um ausschließlich Leerzeichen, Tabs oder Linebreaks neben den geschweiften Klammern zuzulassen (das Problem waren ja Zeilenumbrüche, die durch den regulären Ausdruck nicht abgedeckt waren, aber dennoch im Quelltext vorkamen).
                    Zuletzt geändert von tr-oo-per; 30.05.2010, 16:33.

                    Kommentar


                    • #11
                      Zitat von tr-oo-per Beitrag anzeigen
                      erklär mal bitte oder biete eine Lösung an
                      Hatte ich schon, jedenfalls war der Fragesteller damit zufrieden. Aber meinetwegen nochmal:

                      PHP-Code:
                      '/\\{\\{BeginnExportPublicSection\\}\\}(.*?)\\{\\{EndExportPublicSection\\}\\}/s' 
                      Dein Vorschlag dagegen war halt einfach falsch, auch wenn ich dir Recht gebe, dass ich das hätte freundlicher ausdrücken können – nichts für ungut.
                      [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


                      • #12
                        Mmh, okay.

                        Ich verstehe nur nicht, weshalb Du '\' escape'st ('\\'). Mit nur einem '\' würdest Du ja gerade die geschweiften Klammern escapen, oder?
                        D.h. nach meiner Auffassung ...
                        '/\\{/' liefert alle Stellen an denen '\{' steht, wohingegen
                        '/\{/' alle Stellen liefert an denen '{' steht.

                        Gruß,
                        tr-oo-per

                        Kommentar


                        • #13
                          Zitat von tr-oo-per Beitrag anzeigen
                          Ich verstehe nur nicht, weshalb Du '\' escape'st ('\\'). Mit nur einem '\' würdest Du ja gerade die geschweiften Klammern escapen, oder?
                          Der Regex muss einen Backslash vor { haben, um deren Sonderbedeutung aufzuheben, in einem Nowdoc-String schreibe ich daher

                          Code:
                          $pattern = <<<'EOT'
                          <\{>
                          EOT;
                          In einem SQ/DQ-String dagegen hat auch der Backslash eine Sonderbedeutung, die durch Dopplung aufgehoben wird. PHP macht zwar netterweise auch aus "\{" ein \{, aber wenn man sich dessen nicht bewusst ist, wird man gerade als Anfänger Probleme damit haben, einen \ selbst per Regex zu matchen.

                          "<\\\\>" wird zum Ausdruck <\\> und der matcht ein einzelnes \. Damit das niemand vergisst, verwende ich gerade hier im Forum korrektes Escaping auch in Situationen, in denen es PHP nicht unbedingt notwendig macht.


                          Zitat von tr-oo-per Beitrag anzeigen
                          '/\\{/' liefert alle Stellen an denen '\{' steht
                          Genau das stimmt nämlich nicht.
                          Zuletzt geändert von AmicaNoctis; 30.05.2010, 17:18.
                          [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


                          • #14
                            Zitat von AmicaNoctis Beitrag anzeigen
                            In einem SQ/DQ-String dagegen hat auch der Backslash eine Sonderbedeutung, die durch Dopplung aufgehoben wird. PHP macht zwar netterweise auch aus "\{" ein \{, aber wenn man sich dessen nicht bewusst ist, wird man gerade als Anfänger Probleme damit haben, einen \ selbst per Regex zu matchen.
                            Verstehe. Dann macht das natürlich Sinn. PHP hat mir da bisher in ähnlichen Fällen netterweise keinen Strich durch die Rechnung gemacht, aber ich werd in Zukunft daran denken, falls es doch mal Probleme gibt.

                            Kommentar

                            Lädt...
                            X