[PHP-users 28897] Re: 正規表現による文字列の抽出

Yusuke ITO ito_yusuke @ white.livedoor.com
2006年 3月 29日 (水) 16:55:49 JST


伊東です。

--k.kikuchi<apple @ s21.fxis.fujixerox.co.jp> wrote:
> 全くの素人のため見よう見まねで以下のように書いてみましたが、
> うまく抽出することができませんでした。

私が似たような要件で(仕事じゃないですが)apacheの生ログを解析したかったときは、以下のような処理でまずログを分割しました。参考になるかわかりませんが。

<?php

  // $lineにログが1行入っているものとする
  $cols = explode(' ', $line);
  $in_quote = $in_bracket = false;
  foreach($cols as $col){
    $ch = substr($col, 0, 1);
    $ct = substr($col, -1);
    if($in_quote && ($ct == '"')){
      $in_quote = $in_bracket = false;
      $col = substr($col, 0, -1);
    }elseif(!$in_quote){
      if($in_bracket && ($ct == ']')){
        $in_quote = $in_bracket = false;
        $col = substr($col, 0, -1);
      }elseif(!$in_bracket){
        if($ch == '"'){
          $in_quote = true;
          $col = substr($col, 1);
        }elseif($ch == '['){
          $in_bracket = true;
          $col = substr($col, 1);
        }
        if($in_quote && ($ct == '"')){
          $in_quote = $in_bracket = false;
          $col = substr($col, 0, -1);
        }elseif($in_bracket && ($ct == ']')){
          $in_quote = $in_bracket = false;
          $col = substr($col, 0, -1);
        }
      }
    }
    if($in_quote || $in_bracket){
      $newline .= $col.' ';
    }else{
      $newline .= $col."\t";
    }
  }
  list($rhost, $rlog, $ruser, $date, $request, $status, $size, $referer, $uagent) = explode("\t", $newline);

?>

何をしてるかって、""で囲まれてたり[]で囲まれてたりするログを
項目ごとに分割して、タブ区切りで$newlineに入れているだけです。

そのあと、落ち着いて$refererを解析してはいかがですか?

--
伊東 祐介
ito_yusuke @ white.livedoor.com




-----------------------------------------------
得するキャンペーンやプレゼント情報を是非ご覧下さい!
livedoor 懸賞
http://present.livedoor.com/



PHP-users メーリングリストの案内