2011-03-09 98 views
2

我有以下格式的日志文件: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”)中的右括号显示正在破坏该行的其余部分以免被解析。我检查了scanf的PHP文档(如fscanf所建议的),并且我没有看到任何提及必须转义左括号的内容。

关于如何让第四和第五个元素分别看起来像“用户”和“消息”的任何建议?

+0

我认为它在的fscanf一个bug ... – n00b 2011-03-09 16:10:07

回答

3

使用格式

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

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

(实施例使用的sscanf:http://ideone.com/lJHYa


%[abc]格式说明将使功能读取的字符串由字符仅abc的。相反,%[^xyz]将使函数读取具有x,yz中的任何一个的字符串而不是

因此,上面的%[^]]将读取一个字符串,直到碰到]

+0

AAAH所以这是怎么逃生呢:P还是正则表达式是更好的:P – n00b 2011-03-09 16:08:23

+0

@ n00b32强制性“现在你有2个问题” – 2011-03-09 16:47:59

+0

@da_rockwilder:嗯? – n00b 2011-03-09 16:52:11