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;}

このコードは3つの問題を引き起こします:

  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 に答える