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

071

Nochmal Regex gesucht

  1. 0
    1. 0
    2. 0
      1. 0
        1. 0
          1. 0
            1. 0
              1. 0
                1. 0
                  1. 0
                    1. 0
                  2. 0
                    1. 0
                      1. 0
                        1. 0
                          1. 0
                            1. 0
                              1. 0
                                1. 0

                                  So geht es fast...

                                  1. 0

                                    Diese Zeile krieg ich nicht gematcht

                                    1. 0
                                      1. 0
                                        1. 0
                                          1. 0
                                            1. 0
                                              1. 0

                                                Lösungsalternative: pdftotext

                                          2. 0
                                            1. 0

                                              Diese Zeile krieg ich nicht gematcht - weitere Vereinfachung

                                    2. 0
                                      1. 0
                                        1. 0
                                          1. 0
                                            1. 0
                                              1. 0
                                                1. 0
                                                2. 0
                                                  1. 1
                        2. 0
                        3. 0
                          1. 0
                            1. 0
                              1. 0
                  3. 0

                    Nach Deinen Ergänzungern verbesserte Lösung

                    1. 0
                      1. 0
                        1. 0
                          1. 0

                            Tips zur Fehlersuche

                            1. 0
                              1. 0

                                Du bist nicht allein ...

                                1. 0
                  4. 0
                    1. 0
                      1. 0
              2. 0

                Vorhersehbar untauglicher Lösungsversuch

              3. 0
          2. 0
            1. 0
          3. 0
            1. 0
      2. 0
        1. 0
          1. 0
          2. 0
            1. 0
              1. 0
                1. 0
                  1. 0
            2. 0
      3. 0
        1. 0