开发者

scanf formatting issue

开发者 https://www.devze.com 2023-02-15 15:56 出处:网络
I have a log file with the following format: INFO 2011-03-09 10:26:15,270 [user] message I want to parse the log file using PHP:

I have a log file with the following format:

INFO 2011-03-09 10:26:15,270 [user] message

I want to parse the log file using PHP:

// assume file exists and all that
$handle = fopen("log_file.txt", "r");
while ($line_data = fscanf($handle, "%s %s %s [%s] %s\n")) {
    var_dump($line_data);
}
fclose($handle);

When I run this code I get:

[0]=>
 array(5) {
   [0]=> string(4) "INFO"
   [1]=> string(10) "2011-03-09"
   [2]=> string(12) "10:26:15,270"
   [3]=> string(5) "user]"
   [4]=> NULL
}
// snip

It appears the closing bracket in the format string ("%s %s %s [%s] %s") is disrupting the rest of the line from getting parsed. I checked the PHP docs for scanf (as suggested by fscanf), and I didn'开发者_如何转开发t see anything mentioning having to escape a left bracket.

Any suggestions on how to get the 4th and 5th elements to look like "user" and "message" respectively?


Use the format

"%s %s %s [%[^]]] %s\n"

to prevent the 4th element taking any ] character (of course this assumes there is no user having a ] in the name).

(Example using sscanf: http://ideone.com/lJHYa)


The %[abc] format specifiers will make the function read a string consists of only characters a, b or c. The inverse, %[^xyz] will make the function read a string not having any of x, y and z.

Therefore, the %[^]] above will read a string until hitting a ].


use regular expressions... if you really want fscanf, escape the bracket


http://pubs.opengroup.org/onlinepubs/009695399/functions/scanf.html :

The bytes between the square brackets (the scanlist) comprise the scanset

0

精彩评论

暂无评论...
验证码 换一张
取 消