Twilo: regulärer Ausdruck

Hallo,

kurze Frage, gibt es unter PHP eine Möglichkeit und Configdatei von Perl auszulesen?

die Datei ist wie folgt aufgebaut

#####  
#####  xxx  
#####  
  
$xxx            = "xxx";  
$yyy            = "yyy";  
...  
  
# xxx  
$eee{fff}       = 'xxx';  
  
$ddd{ff1}       = 'xxx';  
$ddd{ff2}       = 'xxx';  
  
%privilege_dscr = ( 'qqq'        => { de => 'xxx%xxx' },  
                    'www'         => { de => 'fff%fff' },  
...  
                  ) ;  
  
$blub           = 'x'  
$aaa            = (getpwnam($blub))[2];  
$aab            = (getpwnam($blub))[3];  
  
@month = qw (Januar Februar Maerz April Mai Juni Juli August September Oktober November Dezember);  
  
1;

ich brauche von dieser Config ein paar Variableninhalte, z.B. von $xxx

da ich nicht weiß, ob man das irgendwie mit PHP parsen kann, habe ich ein regulären Ausdruck versucht
preg_match('/^$xxx *= *"(*)*";$/', $dateiInhalt, $treffer);
ich hab mir das so überlegt, das gesuchte muss mit $xxx anfangen, danach kommt entweder kein oder n Leerzeichen, dann kommt ein Gleichheitszeichen, danach wieder kein oder n Leerzeichen danach dann ein Anführungszeichen, danach dann die gesuchte Zeichenkette, dahinter dann noch ein Anführungszeichen + Semikolon, danach soll die gesuchte Zeichenkette zu Ende sein

als Fehlermeldung erhalte ich "Warning: preg_match(): Compilation failed: nothing to repeat at offset 23 in /home/xxx/yyy.php on line 9"

mfg
Twilo

  1. echo $begrüßung;

    preg_match('/^$xxx *= *"(*)*";$/', $dateiInhalt, $treffer);

    Du hast nicht beachtet, dass das $ in einem RegExp eine besondere Bedeutung hat.
    Weiterhin kann es auch sein, dass keine Leerzeichen sondern Tabulatoren oder andere Whitespace-Zeichen verwendet wurden. Ich würde die Sequenz für Whitespace-Zeichen statt des Leerzeichen verwenden.

    echo "$verabschiedung $name";

    1. Hallo,

      preg_match('/^$xxx *= *"(*)*";$/', $dateiInhalt, $treffer);

      Du hast nicht beachtet, dass das $ in einem RegExp eine besondere Bedeutung hat.

      jo, daran hab ich nicht gedacht :-(

      Weiterhin kann es auch sein, dass keine Leerzeichen sondern Tabulatoren oder andere Whitespace-Zeichen verwendet wurden. Ich würde die Sequenz für Whitespace-Zeichen statt des Leerzeichen verwenden.

      ich habe das jetzt wie folgt geändert
      preg_match('/^\$xxx\s*=\s*"(\w*)";$/', $dateiInhalt, $treffer);
      wenn ich $treffer mit print_r ausgeben lasse, erhalte ich nur folgendes
      Array
      (
      )

      mfg
      Twilo

      1. Hallo,

        RegExp-Evaluator

        mfg
        Twilo

      2. gudn tach!

        ich habe das jetzt wie folgt geändert
        preg_match('/^\$xxx\s*=\s*"(\w*)";$/', $dateiInhalt, $treffer);
        wenn ich $treffer mit print_r ausgeben lasse, erhalte ich nur folgendes
        Array
        (
        )

        wenn die zeilenumbrueche durch "\r\n" realisiert werden, muss vor dem "zeilenende-zeichen", also dem letzten $, noch ein "\r?" oder sowas eingefuegt werden.

        prost
        seth

        1. Hallo,

          ich habe das jetzt wie folgt geändert
          preg_match('/^\$xxx\s*=\s*"(\w*)";$/', $dateiInhalt, $treffer);
          wenn ich $treffer mit print_r ausgeben lasse, erhalte ich nur folgendes
          Array
          (
          )

          wenn die zeilenumbrueche durch "\r\n" realisiert werden, muss vor dem "zeilenende-zeichen", also dem letzten $, noch ein "\r?" oder sowas eingefuegt werden.

          leider bringt das auch keinen Treffer
          Ergebnis

          mfg
          Twilo

          1. gudn tach!

            leider bringt das auch keinen Treffer
            Ergebnis

            m-modifier.

            prost
            seth

            1. Hallo,

              leider bringt das auch keinen Treffer
              Ergebnis

              m-modifier.

              ok

              /^$xxx\s*=\s*"|'["|'];\r?$/m
              gibt bei ... = "xx"x";  xx"x zurück, die Variante von Skeeve gibt nur xx\ zurück

              danke für eure Hilfe

              mfg
              Twilo

  2. Moin!

    preg_match('/^$xxx *= *"(*)*";$/', $dateiInhalt, $treffer);

    Haufenweise Fehler in dem Ausdruck.

    Am ehesten dürfte Dir der hier helfen, wenn der auch nicht narrensicher ist:

    /^\s*$xxx\b\s*=\s*("(?:[^"]|\")*"|'(?:[^']|\')*')/

    Wobei Du anschließend noch das erste und letze Zeichen entfernen mußt.

    Aber wie gesagt: Das ist nicht narrensicher, da es in Perl viele Möglichkeiten gibt, einen Wert anzugebe:

      
    $xxx= 'ccc';  
    $xxx= "ccc";  
    $xxx= q(ccc);  
    $xxx= qq<ccc>;  
    $xxx= <<'ENDE';  
    ccc  
    ENDE  
    $xxx= 'c' x 3;  
    # ad infinitum...  
    
    

    -- Skeeve

    1. Hallo,

      Am ehesten dürfte Dir der hier helfen, wenn der auch nicht narrensicher ist:

      /^\s*$xxx\b\s*=\s*("(?:[^"]|\")*"|'(?:[^']|\')*')/

      ergibt leider kein Ergebnis

      mfg
      Twilo

      1. gudn tach!

        /^\s*$xxx\b\s*=\s*("(?:[^"]|\")*"|'(?:[^']|\')*')/

        ergibt leider kein Ergebnis

        beachte den m-modifier und dessen auswirkungen auf ^ (und $).

        prost
        seth

    2. Servus,

      "(?:[^"]|\")*"

      das funktioniert nicht so, wie Du Dir das wünschst - drehe die Reihenfolge von '\"' und '[^"]' mal um.

      Grüsse

      1. Hallo,

        "(?:[^"]|\")*"

        das funktioniert nicht so, wie Du Dir das wünschst - drehe die Reihenfolge von '\"' und '[^"]' mal um.

        wie müßte das dann aussehen?
        ich steig bei den regulären Ausdruck im Moment nicht ganz durch

        mfg
        Twilo

        1. Servus,

          "(?:[^"]|\")*"

          das funktioniert nicht so, wie Du Dir das wünschst - drehe die
          Reihenfolge von '\"' und '[^"]' mal um.

          wie müßte das dann aussehen?
          ich steig bei den regulären Ausdruck im Moment nicht ganz durch

          ich borge mir mal Skeeves Ausdruck,

          /^\s*$xxx\b\s*=\s*("(?:[^"]|\")*"|'(?:[^']|\')*')/

          und bemerke dazu zwei Dinge:

          1. '^' und '$' machen in der Form nur Sinn, wenn Du entweder einen Einzeiler
          durchsuchen willst, oder den Modifikator '/m' benutzt.

          2. Die oder-Beziehung 'a|b' gibt schon 'true' bei 'a' zurück, wenn an der Position
          im String 'a' vorkommt - 'b' wird gar nicht erst ausprobiert.

          Das sollte es also tun:

          /\s*$xxx\b\s*=\s*("(?:\"|[^"])*"|'(?:\'|[^'])*')/

          , obwohl ich das (wenn überhaupt mit regulären Ausdrücken) wahrscheinlich
          anders machen würde. Der Ausdruck '"(?:\"|[^"])*"' dient hier dazu, nicht
          mitten im Ergebnis bei einem auskommentierten '"' hängen zu bleiben - in
          dem Fall könnte kein Ergebnis gefunden werden.

          Grüsse

          1. Hallo,

            Das sollte es also tun:

            /\s*$xxx\b\s*=\s*("(?:\"|[^"])*"|'(?:\'|[^'])*')/

            es wird etwas zurück gegeben :-)

            , obwohl ich das (wenn überhaupt mit regulären Ausdrücken) wahrscheinlich
            anders machen würde. Der Ausdruck '"(?:\"|[^"])*"' dient hier dazu, nicht
            mitten im Ergebnis bei einem auskommentierten '"' hängen zu bleiben - in
            dem Fall könnte kein Ergebnis gefunden werden.

            wie würdest du das denn machen?

            mfg
            Twilo

          2. gudn tach!

            1. Die oder-Beziehung 'a|b' gibt schon 'true' bei 'a' zurück, wenn an der Position
              im String 'a' vorkommt - 'b' wird gar nicht erst ausprobiert.

            jein.

            du hast zwar z.b. mit

            ~~~perl $_ = 'ab';
              /(a|ab)/;

              
            recht, dass $1=='a' und auch im fall  
              
              ~~~perl
            $_ = 'ba';  
              /([^a]|ba)/;
            

            waere $1=='b', aber im fall von

            ~~~perl $_ = 'abaa;';
              /a([^a]|ba)*a;/;

              
            waere $1=='ba'.  
              
            prost  
            seth
            
      2. gudn tach!

        "(?:[^"]|\")*"

        das funktioniert nicht so, wie Du Dir das wünschst - drehe die Reihenfolge von '\"' und '[^"]' mal um.

        ich denke, dass das (zumindest bei perl) keinen unterschied machen sollte, da afaik automatisch "gebacktrackt" wird.

        #!/usr/bin/perl  
        use strict;  
        $_ = '$xxx="a\"b";';  
        print 'gefunden'."\n" if /^\s*\$xxx\b\s*=\s*("(?:[^"]|\\")*"|'(?:[^']|\\')*');$/;  
        print 'gefunden'."\n" if /^\s*\$xxx\b\s*=\s*("(?:\\"|[^"])*"|'(?:[^']|\\')*');$/;
        

        gibt bei mir zwei mal "gefunden" aus.

        prost
        seth

        1. Hallo,

          "(?:[^"]|\")*"

          das funktioniert nicht so, wie Du Dir das wünschst - drehe die Reihenfolge von '\"' und '[^"]' mal um.

          ich denke, dass das (zumindest bei perl) keinen unterschied machen sollte, da afaik automatisch "gebacktrackt" wird.

          #!/usr/bin/perl

          use strict;
          $_ = '$xxx="a"b";';
          print 'gefunden'."\n" if /^\s*$xxx\b\s*=\s*("(?:[^"]|\")"|'(?:[^']|\')');$/;
          print 'gefunden'."\n" if /^\s*$xxx\b\s*=\s*("(?:\"|[^"])"|'(?:[^']|\')');$/;

            
          
          > gibt bei mir zwei mal "gefunden" aus.  
            
          und wie müßte der reguläre Ausdruck für PHP aussehen?  
            
            
          mfg  
          Twilo  
          
          -- 
          [Farbtabelle](http://www.farb-tabelle.de)
          
          1. gudn tach!

            und wie müßte der reguläre Ausdruck für PHP aussehen?

            fuer dein problem hat Flo wohl die beste loesung bisher genannt.
            bei der loesungen von dedlfix haettest du bloss noch das "\r" beruecksichtigen muessen; und bei der loesung von Skeeve den m-modifer.

            prost
            seth

            1. gudn tach Gunnar!

              fuer dein problem hat Flo wohl die beste loesung bisher genannt.
              bei der loesungen von dedlfix haettest du bloss noch das "\r" beruecksichtigen muessen; und bei der loesung von Skeeve den m-modifer.

              der m-modifer muss selbstverstaendlich auch bei dem loesungsansatz von dedlfix beruecksichtigt werden.

              prost
              seth

    3. gudn tach!

      Am ehesten dürfte Dir der hier helfen, wenn der auch nicht narrensicher ist:

      /^\s*$xxx\b\s*=\s*("(?:[^"]|\")*"|'(?:[^']|\')*')/

      wozu die wortgrenze "\b"? die ist doch schon implizit vorhanden, oder?

      Aber wie gesagt: Das ist nicht narrensicher, da es in Perl viele Möglichkeiten gibt, einen Wert anzugebe [...]

      ack, es empfiehlt sich da eher, sowas, was Flo bereits verlinkt hat (http://pecl.php.net/package/perl) zu benutzen.

      prost
      seth

      1. Moin!

        /^\s*$xxx\b\s*=\s*("(?:[^"]|\")*"|'(?:[^']|\')*')/

        wozu die wortgrenze "\b"? die ist doch schon implizit vorhanden, oder?

        Korrekt. Macht der Gewohntheit. Es schadet aber auch nicht.

        Durch die Diskussion über die Reihenfolge vom Gebackslashten Ausdruck und der Zeichenklasse fiel mir auf: Das geht besser:

        /^\s*$xxx\s*=\s*("(?:[^\"]|\.)*"|'(?:[^\']|\.)*')/m

        Damit dürfte auch PHP zufrieden sein ;-) In den Zeichenklassen wird explizit der Backslash ausgeschlossen. Ich denke nur so läßt sich auch ein Problem beheben, das mir erst jetzt aufgefallen ist:

        $xxx="\"; $yyy="trallala";

        würde mit meinem vorherigen Ausdruck den String "\"; $yyy=" finden. und nicht "\".

        -- Skeeve

        1. Hallo,

          Durch die Diskussion über die Reihenfolge vom Gebackslashten Ausdruck und der Zeichenklasse fiel mir auf: Das geht besser:

          /^\s*$xxx\s*=\s*("(?:[^\"]|\.)*"|'(?:[^\']|\.)*')/m

          hat dieser Ausdruck ein Vorteil gegenüber
          /^\s*$xxx\s*=\s*"|'["|']\s*;s*\r?$/m
          ?

          bei deinen Ausdruck ist das Ergebnis z.B. 'xx'x' bei den anderen xx'x, also ohne die einfachen Hochkommas

          bei deinen Ausdruck verstehe ich folgendes nicht so wirklich
          ("(?:[^\"]|\.)*"|'(?:[^\']|\.)*')
          über eine Erläuterung würde ich mich freuen

          mfg
          Twilo

          1. Moin!

            hat dieser Ausdruck ein Vorteil gegenüber
            /^\s*$xxx\s*=\s*"|'["|']\s*;s*\r?$/m

            Ja.

            bei deinen Ausdruck ist das Ergebnis z.B. 'xx'x' bei den anderen xx'x, also ohne die einfachen Hochkommas

            Bei Deinem Ausdruck wird nicht beachtet, daß das führende und schließende Element gleich sein muß. Zudem erlaubst Du auch das Zeichen | anstelle von " oder '. ("|') wäre richtig ["|'] ist falsch.

            bei deinen Ausdruck verstehe ich folgendes nicht so wirklich
            ("(?:[^\"]|\.)*"|'(?:[^\']|\.)*')
            über eine Erläuterung würde ich mich freuen

            (              # Gruppierung mit Capture nach $1
              "            # "
              (?:          # Gruppierung ohne Capture
                [^\"]     # Jedes Zeichen außer \ und "
              |            # alternativ
                \.        # Ein Backslash gefolgt von einem belibigen Zeichen
              )            # Ende Grupierung
              *            # Das beliebig oft
              "            # "
            |              # alternativ
              '(?:[^\']|\.)*'  # dasselbe Spiel für '
            )              # Ende Capture nach $1

            Hilft das weiter?

            -- Skeeve

            1. Hallo,

              [...]

              Hilft das weiter?

              ja, danke

              jetzt müßte man nur noch folgende Zeichen am Anfang bzw. Ende weg bekommen
              " oder '

              muss ich dafür substring verwenden, oder kann man den regulären Ausdruck dem enstsprechend verändern?

              mfg
              Twilo

              1. Moin!

                jetzt müßte man nur noch folgende Zeichen am Anfang bzw. Ende weg bekommen
                " oder '

                muss ich dafür substring verwenden, oder kann man den regulären Ausdruck dem enstsprechend verändern?

                Du kannst dafür substring verwenden. Den Ausdruck dafür zu ändern ist nicht so einfach möglich. Eventuell geht das hier in PHP:

                (?:"((?:[^\"]|(?:\.)*)"|'((?:[^\']|\.)*)')

                Dann mußt Du als Treffer "$1$2" nehmen. Einer von beiden ist aber immer undefiniert und ich weiß nicht, wie PHP darauf reagiert.

                In Perl würde ich die Ergebniszuweisung, um einen Warnung auszuschließen so machen:
                $value= $1 || $2 || '';

                -- Skeeve

                1. Hallo,

                  Du kannst dafür substring verwenden. Den Ausdruck dafür zu ändern ist nicht so einfach möglich. Eventuell geht das hier in PHP:

                  (?:"((?:[^\"]|(?:\.)*)"|'((?:[^\']|\.)*)')

                  Dann mußt Du als Treffer "$1$2" nehmen. Einer von beiden ist aber immer undefiniert und ich weiß nicht, wie PHP darauf reagiert.

                  In Perl würde ich die Ergebniszuweisung, um einen Warnung auszuschließen so machen:
                  $value= $1 || $2 || '';

                  ich hab dein beitrag gestern nicht gesehen
                  ich hatte es erst einmal wie folgt gelöst substr($treffer[1], 1, -1)
                  dein geänderten Ausdruck werde ich noch testen

                  mfg
                  Twilo

                  1. Moin!

                    ich hatte es erst einmal wie folgt gelöst substr($treffer[1], 1, -1)

                    Ist doch gut!

                    dein geänderten Ausdruck werde ich noch testen

                    Ich persönlich würde den geänderten wohl nur in Ausnahmefällen verwenden.

                    -- Skeeve

                  2. Moin!

                    Mir fällt gerade ein: Besser ist es, auf den gefundenen Treffer einen weiteren regulären Ausdruck anzuwenden:

                    (Perl Syntax) s/\(.)/$1/g damit alle backslashes korrekt behandelt werden. "asd"fg" => "asd"fg"

                    -- Skeeve

  3. Hi Twilo!

    kurze Frage, gibt es unter PHP eine Möglichkeit und Configdatei von Perl auszulesen?

    Wenn du eine Konfigurationsdatei brauchst, die du unter Perl und PHP auslesen kannst, solltest du dir mal das Modul PHP::Include im CPAN anschauen.

    lg Flo

    1. Hallo,

      kurze Frage, gibt es unter PHP eine Möglichkeit und Configdatei von Perl auszulesen?
      Wenn du eine Konfigurationsdatei brauchst, die du unter Perl und PHP auslesen kannst, solltest du dir mal das Modul PHP::Include im CPAN anschauen.

      danke für den Link
      ich brauche das jedoch genau anders herum.
      Das Perl Script stammt nicht von mir. Ich möchte aber auf ein paar Variablen von diesen Script zugreifen.

      mfg
      Twilo

      1. Hallo nochmal!

        kurze Frage, gibt es unter PHP eine Möglichkeit und Configdatei von Perl auszulesen?
        Wenn du eine Konfigurationsdatei brauchst, die du unter Perl und PHP auslesen kannst, solltest du dir mal das Modul PHP::Include im CPAN anschauen.

        danke für den Link
        ich brauche das jedoch genau anders herum.
        Das Perl Script stammt nicht von mir. Ich möchte aber auf ein paar Variablen von diesen Script zugreifen.

        Wäre dann das etwas für dich?

        lg Flo