Michael Richter: Regulärer Ausdruck mit optionalem Inahlt

hallo community

ich hab ein problem, das richtige suchmuster zu erstellen um einen bestimmten string zu durchsuchen

also erstmal der teil um den es geht:
----------------------
Wert1: 12:34:56
Wert2: bla bla bla
Wert3: [xyz]
Wert4: 1234
----------------------
dieser teil kommt 0-16 mal auf im kompletten string vor

was ich bisher als suchmuster mit preg_match_all() benutzt habe:

/Wert1: ([0-9]+):([0-9]+):([0-9]+)\nWert2: (.*?)\nWert3: [(.*?)]\nWert4: ([0-9]+)/

das funktioniert auch soweit
das problem ist, dass Wert3 optional ist und nicht immer vorkommt und wenn der fehlt, dann findet die funktion diesen eintrag nicht

also wie muss ich das suchmuster verändern, damit Wert3 optional gilt?

mfg
Michael

  1. Hi Michael Richter,

    also wie muss ich das suchmuster verändern, damit Wert3 optional gilt?

    [xyz]*    für IMHO dazu, dass er null oder mehrmals da sein darf, ansonsten
    [xyz]{0,}

    MfG, Dennis.

    --
    Signatur 3 von 3:
    Fragen zu Formularen?
    http://tutorial.riehle-web.com hilft!
    1. [xyz]*    für IMHO dazu, dass er null oder mehrmals da sein darf, ansonsten
      [xyz]{0,}

      ne also, wie ich das meine:

      entweder steht da:

      Wert1: 12:34:56
      Wert2: bla bla bla
      Wert3: [xyz]
      Wert4: 1234

      oder:

      Wert1: 12:34:56
      Wert2: bla bla bla
      Wert4: 1234

      1. Hi Michael Richter,

        entweder steht da:

        Wert1: 12:34:56
        Wert2: bla bla bla
        Wert3: [xyz]
        Wert4: 1234

        oder:

        Wert1: 12:34:56
        Wert2: bla bla bla
        Wert4: 1234

        Richtig, im Endeffekt steht da also:

        Wert1: 12:34:56
        Wert2: bla bla bla
        (Wert3: [xyz])
        Wert4: 1234

        Wert 3 in Klammer geschrieben, weil nicht immer da.

        Das ist doch das gleiche, wie wenn ich schreibe:

        1mal           Wert1: 12:34:56
        1mal           Wert2: bla bla bla
        0mal oder 1mal Wert3: [xyz]
        1mal           Wert4: 1234

        Und wenn man dann den Wert 3 mit [xyz]{0,1} überprüft, darf dieser genau 0 mal (minimum) oder 1 mal (maximum) da sein.

        Das ist eigentlich genau, was du willst.

        MfG, Dennis.

        --
        Signatur 2 von 3:
        Die EU und die neuen Mitgliedslnder:
        http://www.riehle-web.com/pkprojekt/
        Oder doch mehr in HTML interessiert?
        http://tutorial.riehle-web.com
        1. Und wenn man dann den Wert 3 mit [xyz]{0,1} überprüft, darf dieser genau 0 mal (minimum) oder 1 mal (maximum) da sein.

          ja, mir ist das schon klar aber das geht nicht so einfach, das ist ja das problem
          du kannst ja gern mal versuchen den suchpattern umzubauen, damit das dann richtig ist, ich habs nämlich nicht geschafft, da liegt der hund begraben (oder wie war dieser spruch :)

          1. Hi Michael Richter,

            ja, mir ist das schon klar aber das geht nicht so einfach, das ist ja das problem
            du kannst ja gern mal versuchen den suchpattern umzubauen, damit das dann richtig ist, ich habs nämlich nicht geschafft, da liegt der hund begraben (oder wie war dieser spruch :)

            Das ist dein RegEx nehme ich an?

            /Wert1: ([0-9]+):([0-9]+):([0-9]+)\nWert2: (.*?)\nWert3: [(.*?)]\nWert4: ([0-9]+)/

            Dann probier doch mal:

            /Wert1: ([0-9]+):([0-9]+):([0-9]+)\nWert2: (.*?)\n(Wert3: )*[(.*?)]*\nWert4: ([0-9]+)/

            Btw: Ich bin mir nicht ganz sicher, ob man * oder + verwenden muss.
            Eins steht für 0 mal oder öfter und eins für 1 mal oder öfter.

            MfG, Dennis.

            --
            Signatur 2 von 3:
            Die EU und die neuen Mitgliedslnder:
            http://www.riehle-web.com/pkprojekt/
            Oder doch mehr in HTML interessiert?
            http://tutorial.riehle-web.com
            1. Hallo Dennis,

              Btw: Ich bin mir nicht ganz sicher, ob man * oder + verwenden muss.
              Eins steht für 0 mal oder öfter und eins für 1 mal oder öfter.

              '*' bedeutet 0-mal oder öfter, '+' 1-mal oder öfter und '?' 0-mal oder 1-mal.

              Grüße aus Nürnberg
              Tobias

              --
              Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
              1. Hi Tobias,

                '*' bedeutet 0-mal oder öfter, '+' 1-mal oder öfter und '?' 0-mal oder 1-mal.

                Danke, das hatte ich vergessen.

                Mein RegEx oben müsste doch eigentlich funktionieren, oder?

                MfG, Dennis.

                --
                Signatur 2 von 3:
                Die EU und die neuen Mitgliedslnder:
                http://www.riehle-web.com/pkprojekt/
                Oder doch mehr in HTML interessiert?
                http://tutorial.riehle-web.com
  2. Huhu Michael

    was ich bisher als suchmuster mit preg_match_all() benutzt habe:

    /Wert1: ([0-9]+):([0-9]+):([0-9]+)\nWert2: (.*?)\nWert3: [(.*?)]\nWert4: ([0-9]+)/

    das funktioniert auch soweit
    das problem ist, dass Wert3 optional ist und nicht immer vorkommt und wenn der fehlt, dann findet die funktion diesen eintrag nicht

    also wie muss ich das suchmuster verändern, damit Wert3 optional gilt?

    Du könntest Dein Muster allgemeiner formulieren z.B. so

    $reg_exp = '#Wert([0-9]+): (.*)$#m';
    $success = preg_match_all($reg_exp, $snipp, $matches);

    siehe dazu

    http://www.php.net/manual/en/pcre.pattern.modifiers.php
    http://www.php.net/manual/en/function.preg-match-all.php

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. $reg_exp = '#Wert([0-9]+): (.*)$#m';
      $success = preg_match_all($reg_exp, $snipp, $matches);

      dann finde ich zwar alle werte aber ich weiß nicht, welcher wert wozu gehört (oder?)

      denn die gruppen gehören zu einem datensatz, kann man sagen

      wie gesagt, der ganze block, mit den 4 werten kommt bis zu 16 mal vor und die 4 werte (oder eben 3, wenn wert3 fehlt) gehören immer zusammen

      1. hi,

        denn die gruppen gehören zu einem datensatz, kann man sagen

        wie gesagt, der ganze block, mit den 4 werten kommt bis zu 16 mal vor und die 4 werte (oder eben 3, wenn wert3 fehlt) gehören immer zusammen

        dann bilden also vier _zeilen_ jeweils einen zusammengehörigen datensatz?

        dann findest du die doch zusammengehörend, wenn du dazwischen im muster einen zeilenumbruch verlangst.

        gruß,
        wahsaga

  3. Hallo Michael,

    Wert1: 12:34:56
    Wert2: bla bla bla
    Wert3: [xyz]
    Wert4: 1234

    was ich bisher als suchmuster mit preg_match_all() benutzt habe:

    /Wert1: ([0-9]+):([0-9]+):([0-9]+)\nWert2: (.*?)\nWert3: [(.*?)]\nWert4: ([0-9]+)/

    das problem ist, dass Wert3 optional ist und nicht immer vorkommt und wenn der fehlt, dann findet die funktion diesen eintrag nicht

    Du kannst um Wert3: [(.*?)]\n eine Klammer setzen und mit ? optional (kein- oder einmal) machen. Damit die zusätzliche Klammer nicht gespeichert wird, solltest Du sie mit (?: beginnen lassen.

    Ich habe aber nicht weiter überlegt, ob man den Ausdruck nicht auch ganz anders formulieren könnte. :)

    Gruß Alex

    --
    >> Dass in eine if Schleife zu packen schafft mein 10 jähriges Patenkind. [...]
    > Mhhh, wenn man if in Schleifen packt, muss man sich auch nicht wundern, wenn die Patenkinder verwöhnte Luder werden. [...]
    [TomIRL und Tom in ?t=64084&m=364291]
    ss:) zu:} ls:} fo:| de:[ va:| ch:| sh:( n4:& rl:° br:& js:| ie:| fl:| mo:}