hawkmaster: Suchmuster Optimierung ?

Hallo zusammen,
habe kein Problem.
Möchte nur mal von euch Experten wissen, ob man in folgendem Fall noch etwas anders machen kann.

in einem Text kommen folgende Zeilen vor:

*OpenUI *PageSize: PickOne
*OpenUI *XYPaperPolicy/Fit to Paper: PickOne

zum Anzeigen bzw. weiterverarbeiten brauche ich:

PageSize
XYPaperPolicy

Wenn ein Wort zwischen Schrägstrich / und : vorkommt also wie bei "/Fit to Paper:" brauche ich auch das Wort dazwischen, also;
Fit to Paper

ich mache das so:
if (preg_match_all("#\OpenUI \(.*?)(/(.*?))?:(.*?)\n#", $teile[1], $uielements)){
..

Mit Hilfe von (/(.*?))? möchte ich sagen das der Schrägstrich und ein Wort dahinter einmal vorkommen kann ODER nicht.
Soweit klappt es auch.

Blos wird mir in der Anzeige später immer der / mit ins Ergebnis aufgenommen.

Gibt es da eine Möglichkeit dies zu optimieren?

vielen Dank und viele Grüße
hawk

  1. Hi hawkmaster!

    if (preg_match_all("#\OpenUI \(.*?)(/(.*?))?:(.*?)\n#", $teile[1], $uielements)){
    ..
    Blos wird mir in der Anzeige später immer der / mit ins Ergebnis aufgenommen.

    Die Treffer werden in einem Array gespeichert. Dort müsste auch der Text ohne den Slash vorhanden sein.

    Was soll eigentlich "*?"? Der Stern steht doch schon für "keins oder beliebig viele". Davon nochmal "kein- oder einmal" zu nehmen erscheint mir sinnfrei.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Hallo Hopsel,
      vielen Dank für deine Hilfe

      Was soll eigentlich "*?"? Der Stern steht doch schon für "keins oder beliebig viele". Davon nochmal "kein- oder einmal" zu nehmen erscheint mir sinnfrei.

      hmm, du meinst das hier?
      (/(.*?))?
      ich dachte (.*?) für ein oder mehrere beliebige Zeichen nach dem /.
      und das ganze zusammen (/ )? darf einmal oder keinmal vorkommen.
      Oder mache ich einen Denkfehler?

      vielen Dank und viele Grüße
      hawk

    2. Hallo nochmals,

      Die Treffer werden in einem Array gespeichert. Dort müsste auch der Text ohne den Slash vorhanden sein.

      das mit dem Array ist klar,
      if (preg_match_all("#\OpenUI \(.*?)(/(.*?))?:(.*?)\n#", $teile[1], $uielements)){

      wenn ich aber z.b.
      print_r($uielements[2]);

      wird mir trotzdem immer der Slash / mit angezeigt.
      /NameXY
      /OptionXY

      ich vermute das es am ? liegt, einmal oder keinmal.
      Denn wenn ich es so mache
      if (preg_match_all("#\OpenUI \(.*?)/(.*?):(.*?)\n#", $teile[1], $uielements)){

      ist er im ergebnis weg. Aber dann werden halt nur die Zeilen gefunden wo wirklich nur /NameXY: vorkommt und z.b. nicht;
      *OpenUI *PageSize: PickOne

      vielen Dank und viele Grüße
      hawk

      1. Hi hawkmaster!

        ich vermute das es am ? liegt, einmal oder keinmal.
        Denn wenn ich es so mache
        if (preg_match_all("#\OpenUI \(.*?)/(.*?):(.*?)\n#", $teile[1], $uielements)){

        Wie wär´s denn mit if (preg_match_all("#\*OpenUI \*(.*)/?(.*):(.*)#", $teile[1], $uielements)){ // ...

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        1. Hallo Hopsel,

          Wie wär´s denn mit if (preg_match_all("#\*OpenUI \*(.*)/?(.*):(.*)#", $teile[1], $uielements)){ // ...

          leider auch nicht,
          in diesem Fall wird mir dann
          XYPaperPolicy/Fit to Paper

          geliefert, also beides zusammen.

          Na ich glaube fast ich muss zwei getrennte Regexe machen.
          vielen Dank und viele Grüße
          hawk

          1. Hi hawkmaster!

            in diesem Fall wird mir dann
            XYPaperPolicy/Fit to Paper
            geliefert, also beides zusammen.

            Da der Slash als Trennelement dient kannst du auch eine Zeichenklasse verwenden, die auf alle Zeichen außer dem Slash passt: #\OpenUI \([^/]*)/?(.*):(.*)#

            Oder du matchst prinzipiell erstmal auf #\OpenUI \([^:]*)# und "explodierst" dann anhand des "/". Dann hast du entweder ein oder zwei Element(e), also "XYPaperPolicy" und evtl. "Fit to Paper".

            MfG H☼psel

            --
            "It's amazing I won. I was running against peace, prosperity, and incumbency."
            George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
            Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)