[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 メーリングリストの案内