Na, dann wollen wir mal:

data.txt:

AB0006777 Lore Ipsum 25 ABC 3,72 AB09899 AB00067127 At vero, eos et 2 1 XYZ 13,11 AB0007711 CD0TZUUZ AB899979 At vero eos et 10 100 XYZ 1.223,50

Ich will Dir nicht verschweigen, dass da jemand ganz schlecht geplant hat. Derartige divergierende Strings werden "teuer". Damit meine ich nicht nur die Rechenleistung (wegen der zu kombinierenden Patterns), sondern auch wegen der extremen Fehleranfälligkeit!

Das scheinbar positive aber nur für Deine Beispieldaten gültige Ergebnis kann hier auf Grund von zahlreichen Unwägbarkeiten in den Daten nicht garantiert werden. Betrachte den Code also als kaputt und Deine Frage

Kann man das überhaupt über eine einzige Regex ermitteln?

als mit "NEIN" beantwortet. Das Problem muss an anderer Stelle gelöst werden.

test.php:

<?php $pattern[] = '^[A-Z0-9]{6,10} [A-Z0-9]{6,10} [A-Z0-9]{6,10} (.*) ([0-9]+) ([0-9]+) (.*) ([0-9.,]*)$'; $pattern[] = '^[A-Z0-9]{6,10} [A-Z0-9]{6,10} (.*) ([0-9]+) ([0-9]+) (.*) ([0-9.,]*)$'; $pattern[] = '^[A-Z0-9]{6,10} (.*) ([0-9]+) ([0-9]+) (.*) ([0-9.,]*)$'; $pattern[] = '^[A-Z0-9]{6,10} [A-Z0-9]{6,10} [A-Z0-9]{6,10} (.*) ([0-9]+) (.*) ([0-9.,]*)$'; $pattern[] = '^[A-Z0-9]{6,10} [A-Z0-9]{6,10} (.*) ([0-9]+) (.*) ([0-9.,]*)$'; $pattern[] = '^[A-Z0-9]{6,10} (.*) ([0-9]+) (.*) ([0-9.,]*)$'; $pattern = '/' . implode('|', $pattern ) . '/'; $rows = file('/tmp/data.txt'); foreach ( $rows as $row ) { $row = trim( $row ); preg_match( $pattern, $row, $arr ); $arrE=[]; foreach($arr as $item) { if ( $item ) { $arrE[] = $item; } } if ( 5 == count( $arrE ) ) { $arrE[5] = $arrE[4]; $arrE[4] = $arrE[3]; $arrE[3] = $arrE[2]; $arrE[2] = false; } print_r( $arrE ); }

Das klappt aber NUR dann, wenn die CODES genau 1 bis 3 mal vorkommen, stets eine Länge von 6 bis 10 Zeichen der Klasse [0-9A-Z] haben. Und wenn nichts dergleichen in dem gesuchten Text (genauer an dessen Anfang) vorkommt. Auch die Zifferngruppen vor dem gesuchten Text müssen genau 1 oder 2 mal vorkommen und der gesuchte Text darf nicht nur aus Ziffern bestehen oder mit einem Leerzeichen gefolgt von Ziffern " [0-9]+" enden.

Array ( [0] => AB0006777 Lore Ipsum 25 ABC 3,72 [1] => Lore Ipsum [2] => [3] => 25 [4] => ABC [5] => 3,72 ) Array ( [0] => AB09899 AB00067127 At vero, eos et 2 1 XYZ 13,11 [1] => At vero, eos et [2] => 2 [3] => 1 [4] => XYZ [5] => 13,11 ) Array ( [0] => AB0007711 CD0TZUUZ AB899979 At vero eos et 10 100 XYZ 1.223,50 [1] => At vero eos et [2] => 10 [3] => 100 [4] => XYZ [5] => 1.223,50 )

Folgende Nachrichten verweisen auf diesen Beitrag:

freiwillige Angabe, für jeden sichtbar
freiwillige Angabe, für jeden sichtbar
freiwillige Angabe, für jeden sichtbar

Vorschau (Nachricht wird im Forum „SELF-Forum“ erscheinen)

  • Keine Tag-Vorschläge verfügbar
  • keine Tags vergeben

abbrechen

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