PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datum/Uhrzeit


#stev#
06.11.2004, 12:26
Hallo,

ich steh mal wieder vor einen Problem:

ich möchte in PHP ein Logfile einer IPTABLES Firewall parsen und dann übersichtlich in einer Tabelle darstellen doch scheiterts schon am RegEx fürs Datum bzw. Uhrzeit

Der String der zu parsen ist:
Nov 6 06:25:17...

Mein RegEx:
^([A-Z][a-z]{2} [1|2|3]?[0-9]) ([[2][0-3]|[0|1]?[0-9]]:[0-9][0-5][0-9]:[0-5][0-9])

Woran scheitert mein RegEx ?


Jan Krüger
08.11.2004, 10:03
Das hat mehrere Gründe:

* Hinter dem Monat tauchen eben keine zwei Leerzeichen auf.
* Du kannst [eckige Klammern] nicht schachteln.
* Zwischen den beiden Doppelpunkten werden niemals drei Ziffern auftauchen.

Korrekturvorschlag:
^([A-Za-z]{3}) ([12]?\d|3[01]) (([01]\d|2[0-3])(:[0-5]\d){2})

Nebenbei bemerkt hilft dir vielleicht auch die Funktion strptime() (http://de.php.net/manual/en/function.strptime.php).

#stev#
09.11.2004, 09:18
* Hinter dem Monat tauchen eben keine zwei Leerzeichen auf.

hmm Kopierfehler in meinen Quelltext is dort nur eine


* Du kannst [eckige Klammern] nicht schachteln.

Ja auch schon festegestellt ich dachte anfangs wegen der ODER Bedingung


* Zwischen den beiden Doppelpunkten werden niemals drei Ziffern auftauchen.

ups gar nicht aufgefallen :mauer:


Korrekturvorschlag:
^([A-Za-z]{3}) ([12]?\d|3[01]) (([01]\d|2[0-3])(:[0-5]\d){2})

hmm aber "([A-Za-z]{3})" trifft doch auch auf eine komplett großgeschrieben Buchstabenfoge zu oder ?

Liefert mir (([01]\d|2[0-3])(:[0-5]\d){2}) nicht 3 Teilstrings anstatt einen ?

ps: ich brauch bei der Uhrzeit nur einen String ... wie gesagt ich möchte das Logfile nur in einer Tabelle wiedergeben und anhand des Prefix auf den ich noch nicht prüfe die Zeile farblich markieren (rot für geblockt, grün für durchgelassen usw.)



Nebenbei bemerkt hilft dir vielleicht auch die Funktion strptime() (http://de.php.net/manual/en/function.strptime.php).


Wie könnte mir die Funktion helfen ?
Der zu überprüfene String steht in der /var/log/messages wie gesagt das ganze soll nur der Übersichtlichkeit bei der Ausgabe des Iptableslogs dienen.

Ansonsten schon mal danke für deine Vorschläge ;)

Jan Krüger
09.11.2004, 11:38
hmm aber "([A-Za-z]{3})" trifft doch auch auf eine komplett großgeschrieben Buchstabenfoge zu oder ?
Ja. Aber es wird kaum der Fall auftreten, dass dadurch falsche Strings gematcht werden.

Liefert mir (([01]\d|2[0-3])(:[0-5]\d){2}) nicht 3 Teilstrings anstatt einen ?
Ja, aber wegen der Klammer außen rum wird das ganze auch in einem einzelnen Match zurückgeliefert. Bei verschachtelten Klammer wird die äußere Klammer zuerst, dann die inneren der Reihe nach geliefert.

Wie könnte mir die Funktion helfen ?
Der zu überprüfene String steht in der /var/log/messages wie gesagt das ganze soll nur der Übersichtlichkeit bei der Ausgabe des Iptableslogs dienen.

Du kannst einfach alles vor dem... Moment... dritten Leerzeichen in eine Variable speichern und mit strptime($datumsschnipsel, "%b %e %T") in ein Array von Zeitwertern konvertieren, aber: obwohl die Funktion im Handbuch dokumentiert ist, fehlt sie bis jetzt in allen aktuellen PHP-Versionen :rolleyes: (gerade beim Testen gemerkt).

#stev#
10.11.2004, 19:42
[edit] altes Problem gelöst hab aber ein neues

ich hab 2 Zeilen im Log :


IN=ppp0 OUT= MAC= SRC=217.226.217.70
IN=ppp0 OUT=eth0 SRC=205.188.8.29


Wie man sieht ist die eine Zeile mit "MAC=" und die andere ohne

Mein Regex für diesen Teil lautet:

IN=(ppp0|eth0) OUT=([ppp0|eth0]?)

Funktioniert super aber wie muss mein RegEx weiter lauten so das dieser auf beide Zeilen zutrifft ich komm einfach nicht weiter ?

ps: zwischen "MAC=" und " SRC=" evl. noch eine Macadresse das sollte wenn möglich mit abgefangen werden.

Jan Krüger
11.11.2004, 09:10
IN=ppp0 OUT= MAC= SRC=217.226.217.70
IN=ppp0 OUT=eth0 SRC=205.188.8.29

IN=(ppp0|eth0) OUT=([ppp0|eth0]?)

Nochmal: in eckigen Klammern kann man keine Alternative mit | schaffen -- eckige Klammern bedeuten, dass genau eins der Zeichen innerhalb der Klammer an dieser Stelle auftauchen darf (mit ein paar Spezialitäten). Du musst also runde Klammern benutzen.
IN=(ppp0|eth0) OUT=(ppp0|eth0)? (MAC=(\S*))? ?SRC=(\S+)
Die Ergebniswerte befinden sich in:
IN - \1
OUT - \2
MAC - \4
SRC - \5

Alles klar?

#stev#
11.11.2004, 13:54
Nochmal: in eckigen Klammern kann man keine Alternative mit | schaffen -- eckige Klammern bedeuten,
gut ok aber wieso matcht es dann die entsprechenden Zeilen ?
... ich hab geschrieben das mir nur MAC und SRC Probleme machen.


...OUT=(ppp0|eth0)? ...
Hatte ich probiert damit hat er mir gar nix mehr gematcht.


...(MAC=(\S*))? ?SRC=(\S+)
Danke das werd ich mal probieren.

Jan Krüger
11.11.2004, 15:42
gut ok aber wieso matcht es dann die entsprechenden Zeilen ?
Weil [eth0|ppp0]? einen beliebigen der Buchstaben matcht (e, t, h, 0, | oder p), oder wegen dem Fragezeichen auch einfach nichts (und nichts befindet sich überall).

#stev#
11.11.2004, 16:12
Weil [eth0|ppp0]? einen beliebigen der Buchstaben matcht (e, t, h, 0, | oder p), oder wegen dem Fragezeichen auch einfach nichts (und nichts befindet sich überall).
ja aber in diesen Fall müsste nur e, t, h, 0 in der entsprechenden variable stehen aber es steht der komplette String "eth0" in der Variable.

Jan Krüger
12.11.2004, 13:05
Dann benutzt deine Sprache anscheinend einen Regex-Dialekt, den ich nicht kenne.