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

Shigetaka Yachi syachi @ brownmush.net
2006年 3月 29日 (水) 15:58:29 JST


矢地です。こんにちは。

On Wed, 29 Mar 2006 15:23:17 +0900
"k.kikuchi" <apple @ s21.fxis.fujixerox.co.jp> wrote:

> 「?q=」から始まる場合もあるためパターンの「&」を外し、
> 「/q=([^&]*)/」のようにして見ました。
> 
> ある程度マッチするのですが件数が合いませんでした。
> 
> おそらくこの場合「&」ではさまれていないとマッチしないと思うのですが、
> 「"」の場合もある場合はどのようにしたら良いのでしょうか?
> 「/?q=|&q=([^\"|&]*)/」のようにしてみたのですが駄目でした。

$pattern = '/&q=([^&"]*)/';
だとだめですか?

ちなみに私なら、logをparseする時点で、
<?php
$line = 'XXX.XXX.XXX.XXX - - [時間] "GET コンテンツ HTTP/1.0" 200 99999 "http://www.google.co.jp/search?hl=ja&q=%82%a0%82%a0%20%82%a0%82%a0%81%40%82%a0&lr=" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)"';
$pattern = '/^(\S+) (\S+) (\S+) \[(.*)\] "(.*?)" (\d+) (\d+) "(.*?)" "(.*?)"$/';
if (preg_match($pattern, $line, $matches)) {
    print_r($matches);
}
?>
として、最初から「"」が含まれないようにREFERERを抜き出します。
そうしてからparse_url()を使うか、自力でゴリゴリ実装すると思います。
正規表現一発にしないで、無理せず、あせらず、ゆっくり、順番に。
# ちょっと上のコードは動くか怪しいですけど・・・

そのうちURL毎に集計したい気分になるかもしれませんし^^
ご参考まで。

-- 
Shigetaka Yachi <syachi @ brownmush.net>




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