mixmastertobsi: RegEX Problem

Hallo Zusammen,

ich hoffe, mir kann hier jemand bei meinem regular expression Problem helfen.

Ich bekomme von der Bank einen Text-String zurück und muss diesen Parsen, um zu prüfen, ob die Überweisung korrekt übertragen wurde.

Jetzt habe ich gedacht, ich kann ja über preg_match einfach parsen, doch leider gelingt es mir nicht…

Der String sieht wie folgt aus.

In diesem Beispiel war die Übetragung OK

20.11.18 10:26:12     Datei zur Bank uebertragen                        
         Hostname   : MULTIVIA                                          
         Auftrag    : Einreichen von Lastschriften              CDD N04E
         Teilnehmer : XXX                    
         Ergebnis   : Uebertragung in Ordnung [01]                      
                      Datenuebertragung verschluesselt [04]             
                      Datenuebertragung komprimiert [05]                
                                                                        
20.11.18 10:26:13     Unterschriftspruefung [21]                        
         Hostname   : MULTIVIA                                          
         Auftrag    : Einreichen von Lastschriften              CDD N04E
         Teilnehmer : XXX                    
         Ergebnis   : Unterschrift(en) in Ordnung [24]                  
         Dateiname  :                                                   
                                                                        
    ====================================================================
     L A S T S C H R I F T E N                                          
     Datei-ID   : MSG5bf3d3332ebbd4.39934837                            
     Datum/Zeit : 20.11.2018/10:26:11+01:00                             
    --------------------------------------------------------------------
     Sammlerreferenz          : PAYMENT5bf3d3332ec0b8.04263918          
     Bank-Code                : XXX
     Kontonummer              : DEXXX
     Auftraggeberdaten        : XXX                          
     Anzahl der Zahlungssaetze: 1                                       
     Summe der Betraege (EUR) : 72,42                                   
     Faelligkeitsdatum        : 22.11.2018                              
    ====================================================================

In diesem Beispiel war die Übetragung fehlerhaft

20.11.18 10:55:19     Datei zur Bank uebertragen                        
         Hostname   : MULTIVIA                                          
         Auftrag    : Einreichen von Lastschriften              CDD N04F
         Teilnehmer : XXX                   
         Ergebnis   : Uebertragung in Ordnung [01]                      
                      Datenuebertragung verschluesselt [04]             
                      Datenuebertragung komprimiert [05]                
                                                                        
20.11.18 10:55:19     Unterschriftspruefung [21]                        
         Hostname   : MULTIVIA                                          
         Auftrag    : Einreichen von Lastschriften              CDD N04F
         Teilnehmer : XXX                
         Ergebnis   : Datei ist in ihrem Aufbau fehlerhaft [54]   

Ich hatte mal folgendes Problem, um die einzelne Bereiche beim Datum zu trennen, doch leider klappt das auch nicht.

preg_match_all("/[0-9]{2}.[0-9]{2}.[0-9]{2}\ [0-9]{2}:[0-9]{2}:[0-9]{2}^([0-9]{2}.[0-9]{2}.[0-9]{2}\ [0-9]{2}:[0-9]{2}:[0-9]{2})*/s",$transactions,$match);

  1. Hallo,

    warum so kompliziert? Wenn ich das richtig sehe, unterscheiden sich die Antworten doch nur im Ergebnis. Frag doch einfach nach den Ergebniscodes ([1], [24]) ab.

    Gruß
    Jürgen

  2. preg_match_all("/[0-9]{2}.[0-9]{2}.[0-9]{2}\ [0-9]{2}:[0-9]{2}:[0-9]{2}^([0-9]{2}.[0-9]{2}.[0-9]{2}\ [0-9]{2}:[0-9]{2}:[0-9]{2})*/s",$transactions,$match);
    

    Auf den ersten Blick:

    [0-9]{2}.[0-9]{2}.[0-9]{2} Matcht zwar auf "20.11.18" aber auch auf "20A11b18".

    \ - Was soll das? Das Leerzeichen hat im Gegensatz zum Punkt keine Sonderbedeutung. Metazeichen sind: [](){}|?+-*^$\.

    Auch der Stern in der Nähe des Endes wirkt sehr deplaziert. Das Dach-Symbol in der Mitte (^) sollte wohl ein Pipe (|) sein und statt dessen ein solches am Anfang stehen.

    Mit:

    <?php
    $txt='20.11.18 10:26:12     Datei zur Bank uebertragen                        
             Hostname   : MULTIVIA                                          
             Auftrag    : Einreichen von Lastschriften              CDD N04E
             Teilnehmer : XXX                    
             Ergebnis   : Uebertragung in Ordnung [01]                      
                          Datenuebertragung verschluesselt [04]             
                          Datenuebertragung komprimiert [05]                
                                                                            
    20.11.18 10:26:13     Unterschriftspruefung [21]                        
             Hostname   : MULTIVIA                                          
             Auftrag    : Einreichen von Lastschriften              CDD N04E
             Teilnehmer : XXX                    
             Ergebnis   : Unterschrift(en) in Ordnung [24]                  
             Dateiname  :                                                   
                                                                            
        ====================================================================
         L A S T S C H R I F T E N                                          
         Datei-ID   : MSG5bf3d3332ebbd4.39934837                            
         Datum/Zeit : 20.11.2018/10:26:11+01:00                             
        --------------------------------------------------------------------
         Sammlerreferenz          : PAYMENT5bf3d3332ec0b8.04263918          
         Bank-Code                : XXX
         Kontonummer              : DEXXX
         Auftraggeberdaten        : XXX                          
         Anzahl der Zahlungssaetze: 1                                       
         Summe der Betraege (EUR) : 72,42                                   
         Faelligkeitsdatum        : 22.11.2018                              
        ====================================================================';
        
    preg_match_all("/^[0-9]{2}\.[0-9]{2}\.[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\s|[0-9]{2}\.[0-9]{2}\.[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\s/",$txt,$match);
    
    print_r($match);
    
    $txt='20.11.18 10:55:19     Datei zur Bank uebertragen                        
             Hostname   : MULTIVIA                                          
             Auftrag    : Einreichen von Lastschriften              CDD N04F
             Teilnehmer : XXX                   
             Ergebnis   : Uebertragung in Ordnung [01]                      
                          Datenuebertragung verschluesselt [04]             
                          Datenuebertragung komprimiert [05]                
                                                                            
    20.11.18 10:55:19     Unterschriftspruefung [21]                        
             Hostname   : MULTIVIA                                          
             Auftrag    : Einreichen von Lastschriften              CDD N04F
             Teilnehmer : XXX                
             Ergebnis   : Datei ist in ihrem Aufbau fehlerhaft [54]';
    
    preg_match_all("/^[0-9]{2}\.[0-9]{2}\.[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\s|[0-9]{2}\.[0-9]{2}\.[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\s/",$txt,$match);
    
    print_r($match);
    

    erhalte ich also:

    Array
    (
        [0] => Array
            (
                [0] => 20.11.18 10:26:12 
                [1] => 20.11.18 10:26:13 
            )
    
    )
    Array
    (
        [0] => Array
            (
                [0] => 20.11.18 10:55:19 
                [1] => 20.11.18 10:55:19 
            )
    
    )
    

    Allerdings weiß ich nicht ganz genau, ob das das ist, was Du willst, denn

    preg_match_all("/[0-9]{2}\.[0-9]{2}\.[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\s/",$txt,$match);
    

    führt in beiden Fällen zu dem selben Ergebnis.

    1. OK - und wie kann ich jetzt nicht nur das Datum, sondern auch den Rest dieses Eintrags im Array ausgeben lassen?

      1. OK - und wie kann ich jetzt nicht nur das Datum, sondern auch den Rest dieses Eintrags im Array ausgeben lassen?

        Erst mal eine Definition oder wenigstens Beispiele dafür liefern, was mit "Rest dieses Eintrags" gemeint ist.

        1. Das jeder EIntrag in einem Array ist und immer nach Datum getrennt wird.

          Array
          (
              [0] => Array
                  (
                      [0] => 20.11.18 10:26:12     Datei zur Bank uebertragen                        
                   Hostname   : MULTIVIA                                          
                   Auftrag    : Einreichen von Lastschriften              CDD N04E
                   Teilnehmer : XXX                    
                   Ergebnis   : Uebertragung in Ordnung [01]                      
                                Datenuebertragung verschluesselt [04]             
                                Datenuebertragung komprimiert [05] 
                      [1] => 20.11.18 10:26:13     Unterschriftspruefung [21]                        
                   Hostname   : MULTIVIA                                          
                   Auftrag    : Einreichen von Lastschriften              CDD N04E
                   Teilnehmer : XXX                    
                   Ergebnis   : Unterschrift(en) in Ordnung [24]                  
                   Dateiname  :                                                   
                                                                                  
              ====================================================================
               L A S T S C H R I F T E N                                          
               Datei-ID   : MSG5bf3d3332ebbd4.39934837                            
               Datum/Zeit : 20.11.2018/10:26:11+01:00                             
              --------------------------------------------------------------------
               Sammlerreferenz          : PAYMENT5bf3d3332ec0b8.04263918          
               Bank-Code                : XXX
               Kontonummer              : DEXXX
               Auftraggeberdaten        : XXX                          
               Anzahl der Zahlungssaetze: 1                                       
               Summe der Betraege (EUR) : 72,42                                   
               Faelligkeitsdatum        : 22.11.2018                              
              ====================================================================
                  )
          
          )
          
          1. Hallo mixmastertobsi,

            nur um Mistverständnisse auszuschließen: Dieses Array hast du oder möchtest Du dieses Array mittels der Regex erhalten?

            Rolf

            --
            sumpsi - posui - clusi
            1. möchte ich erhalten - ich habe aktuell nur den Textstring von der Bank

              1. Hallo,

                ich dachte, du wolltest die Antwort von der Bank dahingehend überprüfen, ob alles OK ist.

                Gruß
                Jürgen

              2. Hallo mixmastertobsi,

                du solltest mehrstufig vorgehen. Zuerst mal zerlegen in die Einträge, dazu kannst Du dieses Pattern nehmen:

                /\d\d\.\d\d\.\d\d \d\d:\d\d:\d\d.*?(?=\s*\d\d\.\d\d\.\d\d \d\d:\d\d:\d\d\|$)/s
                

                oder

                /\d\d\.\d\d\.\d\d \d\d:\d\d:\d\d.*?(?=\s*\d\d\.\d\d\.\d\d \d\d:\d\d:\d\d\|====|$)/s
                

                Es matcht ein Datum und dann non-greedy alles, bis ein weiteres Datum oder das Dateiende kommt. Die zweite Fassung endet zusätzlich an einer Folge aus Gleichheitszeichen (wenn Du diesen Teil nicht dabei haben willst).

                Wichtig ist hier die Option s am Ende, die dafür sorgt dass $ nur das String-Ende, aber keine Zeilenumbrüche darin matcht.

                Wenn Du die Meldungen hast, kannst Du Eintrag für Eintrag nach "Ergebnis" oder /Ergebnis\s+:/ suchen und dann auseinandernehmen, was dahinter steht. Das kann man auch wieder per Regex tun, oder von Hand.

                Rolf

                --
                sumpsi - posui - clusi
          2. Das jeder EIntrag in einem Array ist und immer nach Datum getrennt wird.

            Ach? So?

            <?php
            $txt='20.11.18 10:26:12     Datei zur Bank uebertragen                        
                     Hostname   : MULTIVIA                                          
                     Auftrag    : Einreichen von Lastschriften              CDD N04E
                     Teilnehmer : XXX                    
                     Ergebnis   : Uebertragung in Ordnung [01]                      
                                  Datenuebertragung verschluesselt [04]             
                                  Datenuebertragung komprimiert [05]                
                                                                                    
            20.11.18 10:26:13     Unterschriftspruefung [21]                        
                     Hostname   : MULTIVIA                                          
                     Auftrag    : Einreichen von Lastschriften              CDD N04E
                     Teilnehmer : XXX                    
                     Ergebnis   : Unterschrift(en) in Ordnung [24]                  
                     Dateiname  :                                                   
                                                                                    
                ====================================================================
                 L A S T S C H R I F T E N                                          
                 Datei-ID   : MSG5bf3d3332ebbd4.39934837                            
                 Datum/Zeit : 20.11.2018/10:26:11+01:00                             
                --------------------------------------------------------------------
                 Sammlerreferenz          : PAYMENT5bf3d3332ec0b8.04263918          
                 Bank-Code                : XXX
                 Kontonummer              : DEXXX
                 Auftraggeberdaten        : XXX                          
                 Anzahl der Zahlungssaetze: 1                                       
                 Summe der Betraege (EUR) : 72,42                                   
                 Faelligkeitsdatum        : 22.11.2018                              
                ====================================================================
            
            20.11.18 10:55:19     Datei zur Bank uebertragen                        
                     Hostname   : MULTIVIA                                          
                     Auftrag    : Einreichen von Lastschriften              CDD N04F
                     Teilnehmer : XXX                   
                     Ergebnis   : Uebertragung in Ordnung [01]                      
                                  Datenuebertragung verschluesselt [04]             
                                  Datenuebertragung komprimiert [05]                
                                                                                    
            20.11.18 10:55:19     Unterschriftspruefung [21]                        
                     Hostname   : MULTIVIA                                          
                     Auftrag    : Einreichen von Lastschriften              CDD N04F
                     Teilnehmer : XXX                
                     Ergebnis   : Datei ist in ihrem Aufbau fehlerhaft [54]';
            
            
            $regex = "/[0-9]{2}\.[0-9]{2}\.[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\s/";
            preg_match_all( $regex , $txt , $delims );
            $parts = preg_split( $regex , $txt );
            array_shift ( $parts );
            
            for ( $i=0; $i < count( $delims[0] ); $i++ ) {
               	$parts[$i] = $delims[0][$i] . $parts[$i];
            }
            
            print_r( $parts );
            

            Ergebnis:

            Array
            (
                [0] => 20.11.18 10:26:12     Datei zur Bank uebertragen                        
                     Hostname   : MULTIVIA                                          
                     Auftrag    : Einreichen von Lastschriften              CDD N04E
                     Teilnehmer : XXX                    
                     Ergebnis   : Uebertragung in Ordnung [01]                      
                                  Datenuebertragung verschluesselt [04]             
                                  Datenuebertragung komprimiert [05]                
                                                                                    
            
                [1] => 20.11.18 10:26:13     Unterschriftspruefung [21]                        
                     Hostname   : MULTIVIA                                          
                     Auftrag    : Einreichen von Lastschriften              CDD N04E
                     Teilnehmer : XXX                    
                     Ergebnis   : Unterschrift(en) in Ordnung [24]                  
                     Dateiname  :                                                   
                                                                                    
                ====================================================================
                 L A S T S C H R I F T E N                                          
                 Datei-ID   : MSG5bf3d3332ebbd4.39934837                            
                 Datum/Zeit : 20.11.2018/10:26:11+01:00                             
                --------------------------------------------------------------------
                 Sammlerreferenz          : PAYMENT5bf3d3332ec0b8.04263918          
                 Bank-Code                : XXX
                 Kontonummer              : DEXXX
                 Auftraggeberdaten        : XXX                          
                 Anzahl der Zahlungssaetze: 1                                       
                 Summe der Betraege (EUR) : 72,42                                   
                 Faelligkeitsdatum        : 22.11.2018                              
                ====================================================================
            
            
                [2] => 20.11.18 10:55:19     Datei zur Bank uebertragen                        
                     Hostname   : MULTIVIA                                          
                     Auftrag    : Einreichen von Lastschriften              CDD N04F
                     Teilnehmer : XXX                   
                     Ergebnis   : Uebertragung in Ordnung [01]                      
                                  Datenuebertragung verschluesselt [04]             
                                  Datenuebertragung komprimiert [05]                
                                                                                    
            
                [3] => 20.11.18 10:55:19     Unterschriftspruefung [21]                        
                     Hostname   : MULTIVIA                                          
                     Auftrag    : Einreichen von Lastschriften              CDD N04F
                     Teilnehmer : XXX                
                     Ergebnis   : Datei ist in ihrem Aufbau fehlerhaft [54]
            )
            

            Mir ist aufgefallen, dass vor dem ersten Datum ja $irgendwas stehen kann. Und sei es ein Zeilenumbruch oder eine BOM ...

            1. @mixmastertobsi:

              Ist jene die Lösung nach welcher Du suchtest?