Matthias: regexp frage/problem

Hallo,

ich möchte in php die Zeitangaben aus dem access.log in einen timestamp umwandeln. Dazu will ich preg_match() verwenden, aber ich kriege den regexp nicht korrekt zustande, jedenfalls schreibe ich wie bei ereg_replace meine patterns, aber im Gegensatz zu dort funktionieren die mit preg_match() nicht.

Folgendes Format haben die Zeitangaben: [tt/mmm/yyyy:hh:mm:ss ]
Mein Pattern um dieses Format in jeder Zeile zu suchen und auszulesen: "/[0-9]{1,2}[a-zA-Z/]{1,4}[/0-9:]*/"

Er gibt mir jedoch als Ergebnis nur eine Zeile voller "0".

Was mache ich falsch und wie sollte ich es besser machen, damit es funktioniert ?

Grüße und Danke, Matthias

  1. Hi,

    [...] [tt/mmm/yyyy:hh:mm:ss ]
    [...] "/[0-9]{1,2}[a-zA-Z/]{1,4}[/0-9:]*/"

    das Pattern passt nicht.

    Er gibt mir jedoch als Ergebnis nur eine Zeile voller "0".

    Augenscheinlich ist zudem Deine Abfrage falsch.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo du da draußen,

    Folgendes Format haben die Zeitangaben: [tt/mmm/yyyy:hh:mm:ss ]
    Mein Pattern um dieses Format in jeder Zeile zu suchen und auszulesen: "/[0-9]{1,2}[a-zA-Z/]{1,4}[/0-9:]*/"

    In Worten: Zuerst 1--2 Mal eine Ziffer, dann 1--4 Mal ein Buchstabe von a--z, A--Z oder ein Slash. Dann beliebig oft oder garnicht ein Slash, eine Ziffer oder ein Doppelpunkt. Das passt nunmal nicht auf dein Datum.

    Mal was du brauchst in Worten:
    Für den Tag eine Ziffer von 0--3 und eine Ziffer von 0--9.
    Dann ein Slash.
    Für den Monat eine Ziffer von 0 oder 1 und eine Ziffer von 0--9.
    Dann ein Slash.
    Für das Jahr vier Ziffern von 0--9.
    Dann ein Doppelpunkt.
    und so weiter

    Der reguläre Ausdruck lautet also:
    /[0-3][0-9]/[01][0-9]/[0-9]{4}:[0-2][0-9]:[0-5][0-9]:[0-5][0-9]/

    Er gibt mir jedoch als Ergebnis nur eine Zeile voller "0".

    Wie du auf http://php.net/preg_match nachlesen kannst, liefert preg_match als Ergebnis entweder true oder false zurück, je nachdem, ob der Ausdruck gefunden wurde oder nicht. Deswegen kannst du als dritten Parameter eine Variable angeben (die übrigens nicht existieren muss), in welche dann das Ergebnis geschrieben wird. Die Variable ist dann ein Array, welches in diesem Fall nur einen einzigen Wert enthält: [0] ist das ganze Datum. Vielleicht möchtest du aber den Tag, den Monat, das Jahr etc. einzeln herausziehen. Dazu musst du in deinem regulären Ausdruck die entsprechenden Konstrukte einklammern:
    /([0-3][0-9])/([01][0-9])/ ...

    Nun enthält das Array auch noch andere Werte:
    [1] => der Tag, also das, was in der ersten Klammer steht
    [2] => der Monat, also das, was in der zweiten Klammer steht
    ...

    Falls es dir noch hilft, kannst du auch mit preg_match_all (http://php.net/preg_match_all) alle Daten im ganzen String auf einmal suchen, dann brauchst du nicht in einer Schleife alle Zeilen durchlaufen.
    Um preg_match_all zu verwenden, musst du deinen ganzen String (also die ganze Log-Datei) in einer Variable haben, und zwar nicht pro Zeile in ein Array aufgeteilt.
    Dann bekommst du wieder ein Array (durch den dritten Parameter):
    [0][0] => das gesamte erste gefundene Datum
    [0][1] => die erste Klammer im ersten gefundenen Datum
    [0][2] => die zweite Klammer im ersten gefundenen Datum
    [1][0] => das gesamte zweite gefundene Datum
    [1][1] => die erste Klammer im zweiten gefundenen Datum
    ...

    Ich hoffe, ich konnte dir soweit helfen.

    Grüße von hier drinnen, aus Biberach an der Riss (http://www.stadt-biberach.de/),
    Candid Dauth (Dogfish)

    PS: Ich habe bestimmt wieder wie immer irgendwo einen Fehler gemacht. Man möge mich bitte darauf hinweisen... :-)

    --
    Selten Dumme sind nicht selten, aber dumm.
    http://dogfish.net.tc/