flobee: regulärer ausdruck

Hallo
Ich versuche gerade eine php Datei zu lesen und den Inhalt editierbar zu machen und stelle gerade fest das ich mit String Funktionen ggf. nicht weiter komme.
Ich bin mit regulären Ausdrücken alledings nicht sicher und bin mir nicht klar ob ich hiermit auch weiter komme.
inhalt der datei:
define('KEY','VALUE'); // notes
...

Werte die ich brauche:
den "key" und "value" ggf "notes" wenn welche da sind.
Sowie ART der QUOTES in key und value!! ganz wichtig! (die bekommt man alleding mit strpos() und/oder substr() recht unkompliziert herraus.

und die variablen die mich mit den stringfunktionen zum verzweifeln bringen: leerzeichen zw. den elementen zB.:
define( 'KEY' , "durch den parser \n VALUE" ) ; // notes
define('KEY',    'VALUE'    ); // notes
...

dennoch sehe ich die regelmässigkeit: komma und klammer sind immer da so das ich mit preg_match_all eigentlich alles bekommen können müsste was ich benötige oder?
habe nur keinen plan wie ich den ausdruck schreibe bzw brauch hier hilfe.

mein ersterversuch:

/(^define()((?<=')|(?<="))+([a-zA-Z0-9_])+(?<=,)+((?<=")|(?<='))+([a-zA-Z0-9_])+/i

Gruß Florian
--

  1. Hallo!

    define('KEY','VALUE'); // notes

    define( 'KEY' , "durch den parser \n VALUE" ) ; // notes
    define('KEY',    'VALUE'    ); // notes

    Hiermit

    ([\s]*'"['"][\s]*,[\s]*'"['"][\s]*)[\s]*;[\s]*[/]*[\s]*(.*)

    konnte ich KEY, VALUE und notes einfangen.

    1 => KEY
    2 => VALUES
    3 => notes

    Ich glaube der ist aber was besser, weil hier keine Leerzeichen hinter nodes mit eingefangen werden:

    ([\s]*'"['"][\s]*,[\s]*'"['"][\s]*)[\s]*;[\s]*[/]*[\s]*([\w]+)

    Aber höchstwahrscheinlich könnte man meine Ausdrücke noch kürzer schreiben.

    MfG, André Laugks

    --
    L-Andre @ gmx.de
    1. Aber höchstwahrscheinlich könnte man meine Ausdrücke noch kürzer schreiben.

      Aber generel solltest Du alle Ergebnisse noch mal durch tim(); hagen. Weil auch bei KEY und VALUE Leerzeichen (rechts und links) mitgenommen werden.

      MfG, André Laugks

      --
      L-Andre @ gmx.de
    2. /([\s]*'"['"][\s]*,[\s]*'"['"][\s]*)[\s]*;[\s]*[/]*[\s]*(.*))/
      /([\s]*'"['"][\s]*,[\s]*'"['"][\s]*)[\s]*;[\s]*[/]*[\s]*([\w]+))/

      wow, wat für ne maskiererei :-)
      schon mal vielen dank! (fehlte je ne klammer am ende)

      mich wundert das (?<='|") etwas anderes ist als ["'] (hat man mir mal gesagt das man das aus performance gründen mögl. nicht machen soll(!?)

      und (.*) ist die bedeutung für "nimm alles"?

      die letzte klammer muss als optional: (([\w])?)  bzw (\W?)  , richtig!?

      MfG, André Laugks

      lieben Gruß Florian

      1. die letzte klammer muss als optional: (([\w])?)  bzw (\W?)  , richtig!?

        so vielleicht:
        define ('KEY', "VALUE \n'");         // dghdfg /* */

        /([\s]*'"['"][\s]*,[\s]*'"['"][\s]*)[\s]*;[\s]*(//)*(.*))/

        mit $matches=preg_split( $needle, $string, -1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY)

        [0] => define (
            [1] => 'KEY'           , "VALUE \n'");         // dghdfg /* */
            [2] => KEY
            [3] => VALUE \n'
            [4] => //
            [5] =>  dghdfg /* */

        lieben Gruß Florian

      2. Hallo!

        wow, wat für ne maskiererei :-)

        Naja, wie gesagt vielleicht könnte man das kürzer schreiben.

        (fehlte je ne klammer am ende)

        Eigentlich nicht! Klammern halten Gruppierungen von Submustern fest, mit denen Du über darauf $1, $2,...,$n und \1, \2,...,\n zugreifen kannst.

        preg_match("MEIN_REGULÄRER_AUSDRUCK", "DER_STRING", $match);

        $match[1]; // KEY
        $match[2]; // VALUE
        $match[3]; // nodes

        mich wundert das (?<='|") etwas anderes ist als ["'] (hat man mir mal gesagt das man das aus performance gründen mögl. nicht machen soll(!?)

        Mhhhh, kann ich Dir nicht wirklich beantworten. Da Du nur ein paar lumpige Textdateien hast, wirst Du den Performance-Unterschied fast gar nicht oder gar nicht messen können. Sicherlich kommt das bei einer Datei mit einer Größe von mehreren MB zum tragen. Aber da fehlt mir die Erfahrung.

        und (.*) ist die bedeutung für "nimm alles"?

        Ja

        die letzte klammer muss als optional: (([\w])?)  bzw (\W?)  , richtig!?

        siehe oben

        Ich habe ein sehr gutes Tool gefunden, mit dem ich meine regulären Ausdrücke baue.

        Regex Coach: http://www.weitz.de/regex-coach/

        Beispiel
        http://www.pb82.de/_extern/selfforum/2005_02_09/regexcoach.gif

        MfG, André Laugks

        --
        L-Andre @ gmx.de
        1. Hallo!
          , mit dem ich meine regulären Ausdrücke baue.
          Regex Coach: http://www.weitz.de/regex-coach/
          Beispiel
          http://www.pb82.de/_extern/selfforum/2005_02_09/regexcoach.gif

          Ja den habe ich, aber da komme ich nicht wirklich drauf klar :-?
          vielleicht fehlt mir auch nur die erklärung wie ich etwas zu deuten habe. mein bookmark liste ist lang zu "regex" die dokus noch viel länger :-)

          MfG, André Laugks

          Gruß Florian

          1. Hallo!

            Ja den habe ich, aber da komme ich nicht wirklich drauf klar :-?
            vielleicht fehlt mir auch nur die erklärung wie ich etwas zu deuten habe. mein bookmark liste ist lang zu "regex" die dokus noch viel länger :-)

            Das ist gar nicht schwer. Dazu hättest Du Dir vielleicht einfach nur mal das Bildchen auf der Webseite (http://www.weitz.de/regex-coach/) anschauen sollen.

            Alles was man mit den regulären Ausdruck erkennt wird gelb hinterlegt. Gruppierungen von Submustern kann man über die "Selections-IDs" ansteuern und die werden dann orange hinterlegt.

            MfG, André Laugks

            --
            L-Andre @ gmx.de