Rolf B: Nochmal Regex gesucht

Beitrag lesen

Hallo Pit,

Diese Stelle habe ich aber bereits ermittelt.

Ok, dafür kannst Du den offset-Parameter von preg_match verwenden, dann fängt er erst da an zu suchen. Das hättest Du aber bei deinen Beispielen dazu schreiben müssen.

Alles was dann noch durch Leerzeichen getrennt links vor dem ABC-/XYZ-Wort steht brauche ich genau bis zum letzten Vorkommen plus Stringlänge eines Ausdrucks, der mit AB anfängt und dann ein weiteres Zeichen (Buchstabe oder Ziffer) hat und anschließend eine oder beliebig viele Ziffern bis zu einem Leerzeichen enthält.

Rhabarber Rhabarber Rhabarber? WAS BRAUCHST DU? Ab wo bis wo? Es passt WIEDER nicht zu dein Beispielen. Oder ich bin doof.

$brain->reset()

Nehmen wir nochmal das Beispiel 3 her:

AB0007711 CD0TZUUZ AB899979 At vero eos et 10 100 XYZ 1.223,50
0....:....1....:....2....:....3

Die 3 "Worte" zu Beginn hast Du bereits ermittelt. D.h. du weißt, dass der Text, der dich interessiert, ab Position 28 beginnt.

Alles was ... links vor dem ABC-/XYZ-Wort steht brauche ich bis zum (unverständliches Kauderwelsch)

Ich unterstelle mal, dass das Kauderwelsch nichts anderes ist als "ich will das, was (im Beispiel 3) vor Position 28 steht, nicht mehr haben". Ok. Dafür gibt's den offset-Parameter von preg_match. Und Du willst nicht "alles links vom ABC Wort", sondern alles außer der Zahl, die links vom ABC-Wort steht, oder? Die Zahl hattest Du ja schon separat beschrieben. Demnach müsste es so passen:

$pattern = "/(?<vorwort>.*)\s+(?<zahl>[0-9]+)\s+(?<wort>[A-Z]+)\s+(?<betrag>[0-9.,]+)\s*$/";
if (preg_match($pattern, $line, $matches, 0, $offset) == 1) {
   echo "Text zu Beginn   : $matches[vorwort]<br>";
   echo "Zahl vor Suchwort: $matches[zahl]<br>";
   echo "Gesuchtes Wort   : $matches[wort]<br>";
   echo "Betrag           : $matches[betrag]<br>";
}

Das Pattern verwendet benannte Gruppen (?<name>...), damit Du die gefundenen Fragmente im $matches-Array leicht finden kannst. Ich bin ziemlich grob beim Matchen des Betrags, aber ich denke, du hast plausible Daten und brauchst keine exakte Kontrolle auf Richtigkeit.

Elemente des Patterns sind:

(?<vorwort>.*)\s+ Beliebige Zeichen, und am Ende 1-n Leerstellen

(?<zahl>[0-9]+)\s+ eine Zahl aus 1-n Ziffern 0-9, dann 1-n Leerstellen

(?<wort>[A-Z]+) Dein gesuchtes Wort, aus Buchstaben A-Z. Keine Kleinbuchstaben, keine Umlaute, wenn das nicht passt musst Du hier nachbessern. Ob Du da in die Verlegenheit kommst, wilde Akzentzeichen oder Zeichen aus nicht-deutschen Sprachen zu finden, weiß ich nicht. Das weißt Du.

(?<betrag>[0-9.,]+) Der Betrag, als Zeichenkette aus Ziffern, Punkt und Komma. Wie gesagt, das ist ein grober Match. Er matcht auch Beträge die falsches Format haben. Solange deine Daten nur valide Beträge enthalten, reicht das.

\s$ Zum Schluss noch verirrte Leerstellen überspringen und das Zeilenende matchen. Dadurch wird der gewünschte "von hinten" Effekt erreicht.

Rolf

--
sumpsi - posui - clusi
0 71

Nochmal Regex gesucht

Pit
  • regex
  1. 0
    ursus contionabundo
    1. 0
      ursus contionabundo
    2. 0
      Pit
      1. 0
        Matthias Apsel
        1. 0
          Pit
          1. 0
            ursus contionabundo
            1. 0
              Pit
              1. 0
                Rolf B
                1. 0
                  Pit
                  1. 0
                    Rolf B
                    1. 0
                      Pit
                  2. 0
                    Rolf B
                    1. 0
                      Pit
                      1. 0
                        Rolf B
                        1. 0
                          Matthias Apsel
                          1. 0
                            Pit
                            1. 0
                              Rolf B
                              1. 0
                                Pit
                                1. 0

                                  So geht es fast...

                                  Pit
                                  1. 0

                                    Diese Zeile krieg ich nicht gematcht

                                    Pit
                                    1. 0
                                      ursus contionabundo
                                      1. 0
                                        Pit
                                        1. 0
                                          Self-Nachtwächter
                                          • programmiertechnik
                                          • programmplanung
                                          • regex
                                          1. 0
                                            Rolf B
                                            1. 0
                                              Pit
                                              1. 0

                                                Lösungsalternative: pdftotext

                                                ursus contionabundo
                                          2. 0
                                            Pit
                                            1. 0

                                              Diese Zeile krieg ich nicht gematcht - weitere Vereinfachung

                                              ursus contionabundo
                                    2. 0
                                      Gunnar Bittersmann
                                      1. 0
                                        Pit
                                        1. 0
                                          Gunnar Bittersmann
                                          1. 0
                                            Pit
                                            1. 0
                                              Rolf B
                                              1. 0
                                                Pit
                                                1. 0
                                                  MudGuard
                                                2. 0
                                                  Pit
                                                  1. 1
                                                    Pit
                        2. 0
                          Pit
                        3. 0
                          Pit
                          1. 0
                            Pit
                            1. 0
                              Rolf B
                              1. 0
                                Pit
                  3. 0

                    Nach Deinen Ergänzungern verbesserte Lösung

                    ursus contionabundo
                    1. 0
                      Pit
                      1. 0
                        ursus contionabundo
                        1. 0
                          Pit
                          1. 0

                            Tips zur Fehlersuche

                            ursus contionabundo
                            • php
                            1. 0
                              Pit
                              1. 0

                                Du bist nicht allein ...

                                ursus contionabundo
                                1. 0
                                  Pit
                  4. 0
                    Gunnar Bittersmann
                    1. 0
                      Pit
                      1. 0
                        Gunnar Bittersmann
              2. 0

                Vorhersehbar untauglicher Lösungsversuch

                ursus contionabundo
              3. 0
                pl
          2. 0
            Matthias Apsel
            1. 0
              Pit
          3. 0
            beatovich
            1. 0
              Pit
      2. 0
        pl
        1. 0
          Pit
          1. 0
            Mitleser
            • meinung
            • regex
          2. 0
            pl
            1. 0
              Rolf B
              1. 0
                pl
                1. 0
                  Rolf B
                  1. 0
                    pl
            2. 0
              Gunnar Bittersmann
      3. 0
        dedlfix
        1. 0
          Pit