tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 2 Beitrag von Bratkartoffel
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
215
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MrCPU MrCPU ist offline Grünschnabel
    Registriert seit
    Jan 2012
    Beiträge
    3
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    
    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 :
    1
    
    \[(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
     

  2. #2
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.394
    Hi und herzlich Willkommen

    Laut diesem RegEx Tester funktioniert dein Ausdruck wie ne Eins. Eventuell stimmt bei dir das Escaping für PHP nicht?

    Poste mal bitte die entsprechenden PHP-Zeilen.

    Gruß,
    BK
     
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

  3. #3
    MrCPU MrCPU ist offline Grünschnabel
    Registriert seit
    Jan 2012
    Beiträge
    3
    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-Code:
    <?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-Code:
    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-Code:
    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
    Geändert von MrCPU (20.01.12 um 17:04 Uhr)
     

  4. #4
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.394
    Hi,

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

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

    Das Ergebnis sieht dann so aus:
    PHP-Code:
    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
    chmee und MrCPU bedanken sich. 
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

  5. #5
    MrCPU MrCPU ist offline Grünschnabel
    Registriert seit
    Jan 2012
    Beiträge
    3
    Hi BK,

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


    Tschüü... MrCPU
     

Ähnliche Themen

  1. Hilfe bei Regulärem Ausdruck 2.
    Von exiter28 im Forum .NET Café
    Antworten: 3
    Letzter Beitrag: 06.05.11, 12:55
  2. Hilfe bei Regulärem Ausdruck
    Von exiter28 im Forum .NET Windows Forms
    Antworten: 1
    Letzter Beitrag: 05.05.11, 13:16
  3. Hilfe zu regulärem Ausdruck
    Von d_b im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 2
    Letzter Beitrag: 09.05.09, 10:34
  4. Hilfe bei regulärem Ausdruck
    Von Commanderalpha im Forum PHP
    Antworten: 5
    Letzter Beitrag: 04.09.07, 12:42
  5. Hilfe bei Regulärem Ausdruck
    Von schoko im Forum PHP
    Antworten: 2
    Letzter Beitrag: 02.08.06, 14:50