PHPでログ解析のプログラムを作成しています。
以下のようなプログラムを作成しました。
<?php $handle = fopen("access_log", "r"); $result = []; $pattern = '/^(\S+)\s(\S+)\s(\S+)\s[([\S|\s]+)]\s"([\S|\s]+)"\s(\d+)\s(\d+)\s"\s|(\S+)"\s"([\S|\s]+)"/'; if ($handle) { while ($buffer = fgets($handle)) { preg_match($pattern, $buffer, $elements); $line = ['host'=>$elements[1], 'client'=>$elements[2], 'user'=>$elements[3], 'time'=>$elements[4], 'request'=>$elements[5], 'response_status'=>$elements[6], 'byte'=>$elements[7], 'referer'=>$elements[8], 'agent'=>$elements[9] ]; array_push($result, $line); } } fclose($handle); var_export($result);
combine形式のログを解析して、$patternに代入したいのですが、
'request'=>$elements[5]
'byte'=>$elements[7]
'agent'=>$elements[9]
のelement[]の値が、'-'の場合でも表示できるようにしたいです。
また、
'referer'=>$elements[8]
の値が空白でない場合も表示したいのです。
おそらく、
$pattern = '/^(\S+)\s(\S+)\s(\S+)\s[([\S|\s]+)]\s"([\S|\s]+)"\s(\d+)\s(\d+)\s"\s|(\S+)"\s"([\S|\s]+)"/';
の中の
'request'=>$elements[5]
'byte'=>$elements[7]
'referer'=>$elements[8]
'agent'=>$elements[9]
に該当する箇所に
\S|\s
のように記述して、「空白文字以外、もしくは空白文字にマッチ」という内容に書き換えるのだと思うのですが、上手くいきません。
$patternのどこに \S|\s といった表示を記述すべきなのかアドバイス頂けたらと思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。