Hallo,

Ik heb een korte vraag betreft regex op een log bestand dat ik graag wil ontleden.
Het is een log bestand in het Engels, maar is gecreerd door Japanse programmatuur en ik kan de header niet ontleden.

Wat ik gedaan heb is het bestand in een string gezet en deze ge-encode naar UTF-8. Werkt prima, echter heb ik nog een lelijk stuk header tekst (jibberish) staan die per log bestand varieert qua regels en tekens. Een voorbeeld is:

Encoded UTF-8 versie

¼%ø%M¤ñ>•â/|Éc»èIlÂñ?b‚ÏiÁî#O|±Ý ?_¡÷G		½	 ] ‰ ¶ ë VÅí3b³ä9 Š í


En de non-encoded versie:

¼%ø%M¤ñ>•â/|Éc»èIlÂñ?b‚ÏiÁî#O|±Ý ?_¡÷G		½	 ] ‰ ¶ ë VÅí3b³ä9 Š í 


Ik wou nu gebruik maken van preg_replace om dit stuk er uit te halen, echter ben ik een wrak in regular expressions. Ben er wel mee bezig, echter blijft het me in de war maken.. Wat ik zeker weet is dat "na" deze header-tekens altijd 00 komt (in net ASCII/UTF-8 formaat).

Wat de regex eigenlijke zou moeten doen is;

• geen herhalingen uitvoeren, dus eenmalig (want 00 komt veel vaker voor)
• alle header tekst vóór de eerst 00 weghalen

Het is vast super simpel, echter heb ik al een tijd niet meer geprogrammeerd en zoals ik stelde is mijn regex heel slecht :p.
Met str_replace blijkt dat de vervangingen uitgevoerd moeten worden mét UTF-8 formaat. Ik ga er vanuit dat dit dan ook op de regex geldt. Op deze manier heb ik de kleine rommeltjes die er nog tussen zaten weggehaald:


$logFile = str_replace('þÿóóóþÿ&&&', '', $logFile);
$logFile = str_replace('ìì', '', $logFile);


[size=xsmall]Toevoeging op 13/04/2012 10:26:32:[/size]

Ik heb het al anders opgelost. Blijft dat met een simpele explode het eerste stuk jibberish zich nets afscheid in de eerste array-index.

$logFile = explode("00", $logFile);


Resultaat:


Array
(
    [0] => ¼%ø%M¤ñ>•â/|Éc»èIlÂñ?b‚ÏiÁî#O|±Ý
?_¡÷G		½	
]
‰
¶
ë
VÅí3b³ä9
Š
í

    [1] => 55::INFO_VERBORGEN
    [2] => 55::INFO_VERBORGEN
    [3] => 55::INFO_VERBORGEN
    [4] => 43::INFO_VERBORGEN
    [5] => 55::INFO_VERBORGEN
    [6] => 55::INFO_VERBORGEN
    [7] => 55::INFO_VERBORGEN
    [8] => 55::INFO_VERBORGEN


[size=xsmall]Toevoeging op 13/04/2012 10:36:14:[/size]

Toch nog weer. Nu heb ik nog een ander klein probleem met de explode. Natuurlijk als er bijvoorbeeld een waarde "1001" voorkomt in een van de strings (in de elements), dan split explode deze verkeerd.

Alle log data staat op één regel en wordt gescheiden op een manier van codes gevolgd door "::".

0055::INFO_Aasdasdasd0031::INFO_Basdasdas etc.

Het vervelende is dat de log niet duidelijk aangeeft of het eindigt en begint gewoon de volgende log strak tegen de voorgaande aan.

Weet iemand een preg_split() regex om deze regels netjes te scheiden per 00XX:: (waar XX cijfers en letters kunnen zijn) zodat ik dus net zoiets krijg als ik hierboven al gepost heb (array)?

[size=xsmall]Toevoeging op 13/04/2012 10:48:38:[/size]

Dat ook opgelost:

$logFile = preg_split("/[0]{2}.{2}::/", $logFile);


Nu nog een laatste probleem: Hoe kan ik preg_split de gesplitte data mee laten geven.
Ik krijgen nu:

[1] => DATADATADATA

Ik wil graag bereiken:

[1] => 0021:: DATADATADATA

[size=xsmall]Toevoeging op 13/04/2012 11:03:28:[/size]

Nu heb dit geprobeerd, maar krijg dan precies de omgekeerde wereld:

preg_match_all("/[0]{2}.{2}[:]{1,2}/", $logFile, $matches);


Uitvoer:

Array
(
    [0] => Array
        (
            [0] => 0055::
            [1] => 0055::
            [2] => 0055::
            [3] => 0055::
            [4] => 0055::
            [5] => 0055::
            [6] => 0055::
            [7] => 0055::
            [8] => 0055::
            [9] => 0055::
            [10] => 0055::
            [11] => 0045::
            [12] => 0043::
            [13] => 0045::
            [14] => 0043::
    )
)


[size=xsmall]Toevoeging op 13/04/2012 11:23:41:[/size]

De oplossing voor nu:


$logFileA = preg_split("/[0]{2}.{2}[:]{1,2}/", $logFile);
unset($logFileA[0]);
$logFileA = array_values($logFileA);

preg_match_all("/[0]{2}.{2}[:]{1,2}/", $logFile, $result);
	
foreach ($result[0] as $entry => $string) {
	$result[0][$entry] = $string . ' ' . $logFileA[$entry];
}


Echter is het nooit 100% zeker dat de filtering perfect is. Als in de log ergens 0055:: zou staan, dan breekt de manier van het uitlezen. Dit kan ik echter later wel afhandelen als een niet herkende log-entry op basis van de bepaalde patronen die een entry kan hebben.

Reageren