Pit: Nochmal Regex gesucht

Beitrag lesen

Hallo Rolf,

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

Haha... ich glaub, ich würd auch bekloppt, wenn ich mein Geschreibsel lesen würde, aber inhaltlich ist es leider vollkommen korrekt 😉

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.

Ja, stimmt genau.

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>";
}

Uff, ich bin geplättet! Wahnsinn... ganz ehrlich. Ich hätte nicht gedacht, dass das wirklich in einem einzigen Ausdruck machbar ist. Und dann noch so komfortabel in ein assoziatives array abgelegt. Hut ab, das ist große Klasse. Du hast Recht, ich muß noch ein bißchen feinjustieren, aber das macht keine Probleme. Danke auch für die Erklärung im Anhang, die ist für mich sehr sinnvoll.

Ich hätte ohne Hilfe wirklich versucht, diese Dinge nacheinander Stück für Stück zu ermitteln. Das ist auch der Grund, warum ich das Offset bereits kenne. in Wirklichkeit variiert das natürlich auch gewaltig.

Wäre das auch möglich gewesen, in Deine Regex auch noch zu übernehmen?

Wie gesagt, es ist nicht wirklich nötig, ich komme auch ohne zurecht. Es interessiert mich nur.

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

In dieser Zeile muß ich das den ersten Ausdruck ermitteln, eigentlich das erste Wort bis zum Leerzeichen. Es ist aber immer so, dass der Ausdruck /AB\w\d+\b/ oder auch /AB[a-zA-Z]?\d*\s/ passen würde. Diesen Ausdruck benötige ich auch selber, also nicht nur die Position, also zb. $matches[erster]="AB0007711";

Die (in diesem Beispiel) nachfolgenden Ausdrücke (CD0TZUUZ AB899979) sind optional vorhanden, d.h. mal gibt es einen hiervon, mal 2, 3 oder n davon. Aber die entsprechen ebenfalls immer /AB\w\d+\b/ oder auch /AB[a-zA-Z]?\d*\s/ (auch, wenn das in obigem Beispiel nicht so ist, da ist einfach der Beispieldatensatz nicht ganz korrekt). Hier bräuchte ich alle Ausdrücke in einer Variable, also zb. $matches[zweiter]="CD0TZUUZ AB899979";

Aber nochmal: Gerade, nachdem ich Deinen Zusatz zur antwort gelesen habe, brauche ich das nicht mehr wirklich, es ingteressiert mich nur, ob das auch gegangen wäre. 😀

Pit

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