Problem mit Regex Ausdruck

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

  • 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
    Last edited by Buddy; 26-05-2010, 18:52.

  • #2
    Originally posted by Buddy View Post
    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.

    Comment


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

      Comment


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

        Comment


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

          Comment


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

            Comment


            • #7
              Originally posted by AmicaNoctis View Post
              Hallo,

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

              Gruß,

              Amica
              super, danke!

              Comment


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

                Comment


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

                  Comment


                  • #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).
                    Last edited by tr-oo-per; 30-05-2010, 15:33.

                    Comment


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

                      Comment


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

                        Comment


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


                          Originally posted by tr-oo-per View Post
                          '/\\{/' liefert alle Stellen an denen '\{' steht
                          Genau das stimmt nämlich nicht.
                          Last edited by AmicaNoctis; 30-05-2010, 16: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]

                          Comment


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

                            Comment

                            Working...
                            X