我有一个日志文件,格式如下:
INFO 2011-03-09 10:26:15,270 [user] message
我想使用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);
当我运行此代码时,我得到:
[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
格式字符串(“%s%s%s [%s]%s”)中的结束括号显示正在中断其余部分的解析。我检查了PHP文档的scanf(由fscanf建议),我没有看到任何提到必须逃离左括号。
有关如何让第4和第5个元素分别看起来像“用户”和“消息”的任何建议吗?
答案 0 :(得分:3)
使用格式
"%s %s %s [%[^]]] %s\n"
防止第4个元素占用任何]
个字符(当然这假设用户名中没有]
。)
(使用sscanf示例:http://ideone.com/lJHYa)
%[abc]
格式说明符将使函数读取仅包含字符a
,b
或c
的字符串。反之,%[^xyz]
将使函数读取字符串而不是具有x
,y
和z
中的任何一个。
因此,上面的%[^]]
会在点击]
之前读取字符串。
答案 1 :(得分:0)
使用正则表达式...如果你真的想要fscanf,请转义括号
http://pubs.opengroup.org/onlinepubs/009695399/functions/scanf.html :
方括号(扫描列表)之间的字节构成扫描集