我想在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;}
这段代码产生了三个问题:
- 它跳过日志文件 的第一行。
- 文本只能包含字母和数字(以及我定义的所有其他特殊字符),但如果我只能排除分隔符 ,这是更好的设计。对于这个任务,fscanf真的是最好的(最快的,最少的内存消耗)函数吗?或者一个带分隔符的简单的fget函数会更好吗?
非常感谢您的帮助;-)
从您的示例数据来看,在我看来,最好的方法是内置的csv函数,fgetcsv和fputcsv。只需使用空格而不是逗号作为分隔符。这些函数会自动记住引号中的值。
可能有一种更简单的方法来做到这一点,但是一个不需要分隔符的稍微长一点的正则表达式解决方案是
$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