scanf格式化问题

时间:2011-03-09 15:56:15

标签: php formatting scanf

我有一个日志文件,格式如下:

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个元素分别看起来像“用户”和“消息”的任何建议吗?

2 个答案:

答案 0 :(得分:3)

使用格式

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

防止第4个元素占用任何]个字符(当然这假设用户名中没有]。)

(使用sscanf示例:http://ideone.com/lJHYa


%[abc]格式说明符将使函数读取仅包含字符abc的字符串。反之,%[^xyz]将使函数读取字符串而不是具有xyz中的任何一个。

因此,上面的%[^]]会在点击]之前读取字符串。

答案 1 :(得分:0)

使用正则表达式...如果你真的想要fscanf,请转义括号


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

  

方括号(扫描列表)之间的字节构成扫描集