0

我想在 PHP中创建一个简单的日志文件,以后可以由 PHP读取。

此日志文件应如下所示:

1303942306 26.4 "Lore ipsum 1" 84.169.73.55 appname1 
1303942308 28.8 "Lore ipsum 2" 84.169.73.55 appname2
1304078658 31.2 "Lore ipsum 3" 80.187.103.95 appname3

如您所见,它应该包含以下变量:

$timestamp
$float
$text (with spaces and other special characters)
$ip
$appname

到目前为止,无需在此日志文件中保存文本(带空格),因此我可以使用一个简单的 fscanf 函数。

我试过用“|” 作为 fscanf 的分隔符 - 但是,它有一些“故障”;-):

//write to file
$statisticsfile = fopen("user.history",'a+b');
     fputs($statisticsfile, time().' | '.$float.' | '.$text.' | '.$_SERVER['REMOTE_ADDR'].' | '.$appname."\r\n");

//read from file
    while ($userinfo = fscanf($statisticsfile, "%[0-9] | %[0-9.-] | %[a-zA-Z0-9 ,] | %[0-9.] | %[0-9]")) 
{list ($timestamp[], $float[], $text[], $ip[], $appname[]) = $userinfo;}

这段代码产生了三个问题:

  1. 它跳过日志文件中的第一行
  2. 文本只能包含字母和数字(以及我定义的所有其他特殊字符),但如果我只能排除分隔符,这是一个更好的设计
  3. fscanf 真的是这项任务的最佳(最快、最少内存消耗)功能吗?或者带有分隔符的简单 fget 函数会更好吗?

我将衷心感谢您的帮助 ;-)

4

2 回答 2

1

从您的示例数据来看,在我看来,最好的方法是内置 csv 函数fgetcsvfputcsv。只需使用空格而不是逗号作为分隔符。这些函数将自动注意引用的值。

于 2011-10-04T22:53:07.197 回答
1

可能有一种更简单的方法可以做到这一点,但是对于不需要分隔符的一个稍长的正则表达式解决方案可能是

$reg = /^(\d{10})\s(\d+[\.]\d*)\s"(.*?)"\s\b((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\b\s(\w+)$/;

ip 捕获组使它看起来更糟。

然后你可以用它来制作和打破这样的文本行...... http://ideone.com/hCvPy

于 2011-10-04T23:22:10.377 回答