Hilfe bei Regulärem Ausdruck (Auswertung Log-Datei)

MrCPU

Grünschnabel
Hi,

ich weiß nicht, ob es daran liegt, das heute Freitag ist, oder ob ich mich gerade nur dumm anstelle, aber ich brauche etwas Hilfe und hoffe auf euer Wissen. ;)

Folgendes Problem:
Ich brauche 2 Werte aus einer Zeile einer Log-Datei.

Szenario:
Code:
0000-00-00 00:00:00 [TYPE1] Test Test Test Test Value1 Test Test
0000-00-00 00:00:00 [TYPE1] Test Test Test Test Test Test Test
0000-00-00 00:00:00 [TYPE2] Test Test Value2 Test Test Test Test
0000-00-00 00:00:00 [TYPE3] Test Test Test Value3 Test Test Test
0000-00-00 00:00:00 [TYPE1] Test Test Test Test Test Test Test
0000-00-00 00:00:00 [TYPE1] Value2 Test Test Test Test Test Test
0000-00-00 00:00:00 [TYPE2] Test Test Test Test Test Test Test
0000-00-00 00:00:00 [TYPE1] Test Value1 Test Test Test Test Test

Ich benötige davon den TYPE und das Value.
Bisher habe ich das ganze mit 2 Regulären Ausdrücken gemacht, aber da die Log-Datei nun langsam etwas größer wird wollte ich die Laufzeit des PHP-Scriptes verringern indem ich die Anzahl der Regulären Ausdrücke halbiere.

Folgenden Ansatz hatte ich:
Code:
\[(TYPE1|TYPE2|TYPE3)\] .*?(Value1|Value2|Value3)

Ja, TYPE und Value haben wenige feste Werte, daher mit einer einfachen Oder-Abfrage lösbar.

Der angegebene RegEx funktioniert soweit auch, dass er mir die Zeilen ausgibt, wo beide Werte vorhanden sind. Leider benötige ich aber alle Zeilen, auch die, wo der Value nicht enthalten ist, also war mein guter Glaube einfach ein ? ans Ende zu setzen um somit aufzuzeigen, das der Value nicht vorhanden sein muß. Allerdings findet er dann überhaupt keinen Value mehr.

Bin für jeden Tip dankbar, da ich nun schon alles möglich ausprobiert hab und vielleicht den Wald vor lauter Bäumen nicht mehr sehe.


Tschüü... MrCPU
 
Hi BK,

da muß ich dich leider enttäuschen.
Hab gerade mal schnell ein Testscript geschrieben, da ich bisher nur mit "The Regex Coach" (TRC) die Vorbereitungen getroffen habe und war nun doch etwas verunsichert, ob nach der mehrjährigen Nutzung des Tools vielleicht doch mal eine andere Auflösung des RegEx zwischen PHP und TRC vorliegt.

Hier mal das Testscript:
PHP:
<?php
    $logData[0] = '0000-00-00 00:00:00 [TYPE1] Test Test Test Test Value1 Test Test';
    $logData[1] = '0000-00-00 00:00:00 [TYPE1] Test Test Test Test Test Test Test';
    $logData[2] = '0000-00-00 00:00:00 [TYPE2] Test Test Value2 Test Test Test Test';
    $logData[3] = '0000-00-00 00:00:00 [TYPE3] Test Test Test Value3 Test Test Test';
    $logData[4] = '0000-00-00 00:00:00 [TYPE1] Test Test Test Test Test Test Test';
    $logData[5] = '0000-00-00 00:00:00 [TYPE1] Value2 Test Test Test Test Test Test';
    $logData[6] = '0000-00-00 00:00:00 [TYPE2] Test Test Test Test Test Test Test';
    $logData[7] = '0000-00-00 00:00:00 [TYPE1] Test Value1 Test Test Test Test Test';

    $regEx = '/\[(TYPE1|TYPE2|TYPE3)\] .*?(Value1|Value2|Value3)/';

    foreach ($logData as $logLine) {
        if (preg_match($regEx, $logLine, $lineData)) {
            unset($lineData[0]);
            var_dump($lineData);
            echo '<br />';
        }
    }
?>

Ohne das ? am Ende kommt:
PHP:
array(2) { [1]=> string(5) "TYPE1" [2]=> string(6) "Value1" }
array(2) { [1]=> string(5) "TYPE2" [2]=> string(6) "Value2" }
array(2) { [1]=> string(5) "TYPE3" [2]=> string(6) "Value3" }
array(2) { [1]=> string(5) "TYPE1" [2]=> string(6) "Value2" }
array(2) { [1]=> string(5) "TYPE1" [2]=> string(6) "Value1" }

und mit dem ? am Ende:
PHP:
array(1) { [1]=> string(5) "TYPE1" }
array(1) { [1]=> string(5) "TYPE1" }
array(1) { [1]=> string(5) "TYPE2" }
array(1) { [1]=> string(5) "TYPE3" }
array(1) { [1]=> string(5) "TYPE1" }
array(2) { [1]=> string(5) "TYPE1" [2]=> string(6) "Value2" }
array(1) { [1]=> string(5) "TYPE2" }
array(1) { [1]=> string(5) "TYPE1" }

Leider sind beide Ergebnisse nicht die gewünschten.


Tschüü... MrCPU
 
Zuletzt bearbeitet:
Hi,

oh, hab überlesen, dass du auch die Zeilen ohne Value brauchst...
Hier, der sollte jetzt gehen:

Code:
(\[[^\]]+\]) (.+(Value1|Value2|Value3).+|.+)

Das Ergebnis sieht dann so aus:
PHP:
array(2) {
  [1]=> string "TYPE1"
  [2]=> string "Test Test Test Test Test Test Test"
  [3]=> string "Value1"
}

[1]: Der Typ
[2]: Die komplette Nachricht
[3]: Der Value oder NULL, falls nicht gesetzt.

Gruß,
BK
 
Hi BK,

super, Danke für die Hilfe.
Funktioniert ohne Probleme mit ein paar kleinen Anpassungen.
Schönes Wochenende noch. :)


Tschüü... MrCPU
 
Zurück