Gunther: [RegExp] Brauche bitte Hilfe bei Suchmuster für preg_replace

Hallo zusammen!

Folgendes Problem:
Ich habe bei einem Projekt einen Datei-Upload. Die hochgeladene Datei (im Prinzip eine reine Textdatei) soll nun nach Kommentaren durchsucht werden, und diese sollen rausfliegen.

Verwenden möchte ich gerne preg_replace().

Leider kapiere ich RegExp immer noch in dem Maße, dass ich mir hier das erforderliche Suchmuster selber erstellen könnte.

Folgende Syntax kennzeichnet Kommentare:
1.) -- gefolgt von beliebigen Zeichen bis Zeilenende
2.) --[[ gefolgt von beliebigen Zeichen bis ]]

Bis hierhin hatte ich es mit folgendem Ausdruck versucht: $luafile = preg_replace('/((-){2}.*[^\n]|--[[.* [^]]{2})/', '', $luafile);

Aber die 3. Möglichkeit stellt mich vor ein für mich unlösbares Problem:
3.) --[==[ gefolgt von beliebigen Zeichen bis ]==]
wobei es auf die Anzahl der Gleichheitszeichen ankommt. Also Ende ist erst genau da, wo die Zeichenfolge mit exakt derselben Anzahl an Gleichheitszeichen kommt. Dazwischen können auch erneut andere Zeichenfolgen --[[/ --[====[ vorkommen, die dann aber keine Rolle spielen.

Also von: --[==[ bis exakt ]==]

Es wäre wirklich sehr nett, wenn mir ein RegExp-Profi bitte gerade mal ein entsprechendes Suchmuster erstellen könnte (auch wenn das hier dem Self-Charakter zuwider läuft, aber mit RegExp tue ich mich als Laie nun wirklich sehr schwer) - danke!

Gruß Gunther

  1. Hallo zusammen!

    Hallo

    Folgendes Problem:
    Ich habe bei einem Projekt einen Datei-Upload. Die hochgeladene Datei (im Prinzip eine reine Textdatei) soll nun nach Kommentaren durchsucht werden, und diese sollen rausfliegen.

    Verwenden möchte ich gerne preg_replace().

    Leider kapiere ich RegExp immer noch in dem Maße, dass ich mir hier das erforderliche Suchmuster selber erstellen könnte.

    Folgende Syntax kennzeichnet Kommentare:
    1.) -- gefolgt von beliebigen Zeichen bis Zeilenende
    2.) --[[ gefolgt von beliebigen Zeichen bis ]]

    Bis hierhin hatte ich es mit folgendem Ausdruck versucht: $luafile = preg_replace('/((-){2}.*[^\n]|--[[.* [^]]{2})/', '', $luafile);

    [^\n] = alles ausser eine newline
    [\n]  = eine newline

    warum nicht
    '/--.*?\n|--[[.*?]]/'

    Aber die 3. Möglichkeit stellt mich vor ein für mich unlösbares Problem:
    3.) --[==[ gefolgt von beliebigen Zeichen bis ]==]

    wobei es auf die Anzahl der Gleichheitszeichen ankommt. Also Ende ist erst genau da, wo die Zeichenfolge mit exakt derselben Anzahl an Gleichheitszeichen kommt. Dazwischen können auch erneut andere Zeichenfolgen --[[/ --[====[ vorkommen, die dann aber keine Rolle spielen.

    Kein Problem. Wir verwenden $1 und \1
    '/--[(=+)[.*?]\1]/'

    und nun zusammengesetzt
    '/--.*?\n|--[[.*?]]|--[(=+)[.*?]\1]/'

    und etwas ausfaktoriert
    '/--(?:.*?\n|[[.*?]]|[(=+)[.*?]\1])/'

    ich kann mir [[ als [=?[ auffassen und den mittleren Ausdruck sparen:
    '/--(?:.*?\n|[(=*)[.*?]\1])/'

    Nun aber noch ein Problem mit der Reihenfolge
    '/--(?:[(=*)[.*?]\1]|.*?\n)/'

    Testen musst du selbst.

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    1. Hallo Beat!

      Nun aber noch ein Problem mit der Reihenfolge
      '/--(?:[(=*)[.*?]\1]|.*?\n)/'

      Testen musst du selbst.

      Super! Vielen Dank insbesondere für die ausführlich erklärte Herleitung. Ich habe die Hoffnung ja noch nicht aufgegeben, dass ich das eines Tages auch noch mal vollständig kapiere. ;-)

      Und mit einem Modifier 's' zusammen, scheint es auch tatsächlich exakt so wie gewollt zu funktionieren.

      Also besten Dank nochmal!

      Gruß Gunther

      1. Hallo zusammen!

        Und mit einem Modifier 's' zusammen, scheint es auch tatsächlich exakt so wie gewollt zu funktionieren.

        Es war doch noch nicht ganz, vorwiegend deswegen, weil ich eine bestimmte Konstellation nicht bedacht hatte.

        Mit weiterer Hilfe von anderer netter Seite bin ich jetzt zu folgendem Pattern gekommen:

          
        $pattern = '/((?:(?:([\'"])(?:.*?\\\2)*?(?:.*?[^\\])?\2|\[(=*)\[.*?\]\3\])[^\'"]*?)*?)--(?:\[(=*)\[.*?\]\4\]|[^\n]*)/s';  
        
        

        Wenn ich das online teste, funktioniert das Suchmuster - siehe: http://regexp-evaluator.de/evaluator/aba5e4152d93e4342c8b4bdaf0ec9c9c/#ergebnis

        Wenn ich das selbe Suchmuster auf meinem Server verwende, kommt folgende Warning: preg_replace() [function.preg-replace]: Compilation failed: missing ) at offset 99

        PHP 5.2.5-0.dotdeb.0
        PCRE Library Version 7.3 2007-08-28

        Frage: Woran kann das liegen? Ich habe leider überhaupt keine Idee mehr, wo ich noch suchen soll/ könnte?

        Für eure Hilfe meinen besten Dank im Voraus!

        Gruß Gunther

        1. Lieber Gunther,

          Warning: preg_replace() [function.preg-replace]: Compilation failed: missing ) at offset 99

          PHP 5.2.5-0.dotdeb.0
          PCRE Library Version 7.3 2007-08-28

          Frage: Woran kann das liegen? Ich habe leider überhaupt keine Idee mehr, wo ich noch suchen soll/ könnte?

          und wenn Du alle runden Klammern innerhalb einer Character Class (unnötigerweise, aber eben zu Testzwecken) mit einem Backslash escapest?

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
          1. Lieber Felix,

            und wenn Du alle runden Klammern innerhalb einer Character Class (unnötigerweise, aber eben zu Testzwecken) mit einem Backslash escapest?

            das bringt leider auch nichts!

            Kann es sein, dass es in PHP diesbezüglich einen Bug gibt?

            Der/ das Pattern funktioniert in diversen online Regex-Testern, sowie in lokalen Anwendungen - nur in meinem Script tauchen plötzlich Fehlermeldungen auf und die Funktion arbeitet nicht wie erwartet -> versteh' ich nicht.

            Wer mir also diesbezüglich weiterhelfen kann, oder mir einen Tipp geben kann, in welche Richtung ich da zumindest suchen könnte - meinen besten Dank!

            Gruß Gunther

            1. Lieber Gunther,

              Der/ das Pattern funktioniert in diversen online Regex-Testern, sowie in lokalen Anwendungen - nur in meinem Script tauchen plötzlich Fehlermeldungen auf und die Funktion arbeitet nicht wie erwartet -> versteh' ich nicht.

              Wenn Du "Compilation failed: missing ) at offset 99" erhälst, dann finet PHP anscheinend 99(!) Compilations in Deinem Muster. Und das kann nur passieren, wenn Du irgendeinen speziellen Syntax-Spezialfall hast (ich vermeide hier das Wort "Fehler")...

              Weiter probieren und alles, was irgendwo stören könnte, mit Backslashes escapen. Oder auch das Muster vereinfachen und nach und nach erweitern, bis die Fehlermeldung auftaucht. So solltest Du die Ursache des Problems finden können.

              Liebe Grüße,

              Felix Riesterer.

              --
              ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
              1. Lieber Felix,

                Wenn Du "Compilation failed: missing ) at offset 99" erhälst, dann findet PHP anscheinend 99(!) Compilations in Deinem Muster. Und das kann nur passieren, wenn Du irgendeinen speziellen Syntax-Spezialfall hast (ich vermeide hier das Wort "Fehler")...

                Ich dachte bisher eigentlich, dass diese Meldung auf eine fehlende Klammer ')' im Pattern hinweist!?
                Nur das identische Suchmuster funktioniert ja in diversen Regex-Testern ohne Beanstandung!?

                Weiter probieren und alles, was irgendwo stören könnte, mit Backslashes escapen. Oder auch das Muster vereinfachen und nach und nach erweitern, bis die Fehlermeldung auftaucht. So solltest Du die Ursache des Problems finden können.

                Aus genanntem Grund weiß ich nicht, wo ich da anfangen und wo aufhören soll. Das Suchmuster ansich ist ja korrekt!

                Ich möchte halt nur gerne wissen/ verstehen, warum es auf meinem Server nicht korrekt funktioniert? Das muss ja einen Grund haben. Und den möchte ich gerne wissen.

                Dank & Gruß
                Gunther