当サイトにあるカウンタにつけたユーザエージェント文字列の分析が破綻してきています。カウンタが分類しきれていない奴らを観察していると、正規表現(しかも現在は手で追加しなければならない)では表現しづらいものが増えているように思います。
特にIEのレンダリングエンジンを使っているブラウザが多くて、ユーザエージェント文字列の種類も多様です。
手でやるのはもうマンドクサくて死にそうなので、ちゃんと文字列をパースして分類しようと思います。
User-Agentヘッダを表現するBNF(Backus-Naur Form)はRFC 2616 "Hypertext Transfer Protocol -- HTTP/1.1" あたりを見ると書いています。User-AgentヘッダのBNFを見る限りでは、パーサプログラムの主な分岐点は、先読みした1文字が「括弧か否か」ってくらい(※)です。
その程度であれば再帰下降パーサ(recursive descent parser)をガリガリと書けば良さそうです。昔授業で書いた気がするけど完全に忘れたな。一番簡単なパーサだろうし、たぶん書けるだろう…。
パーサに通すと、"Mozilla/5.0 (hogehoge)" のような文字列は、"Mozilla" というプロダクト名と "5.0" というプロダクトのバージョンのペア、そして括弧内のコメント文字列 "hogehoge" に分けられます。
バージョンやコメントは省略できます。以下その例です。
・プロダクトとコメントの間に空白なし "Mozilla/5.0(hego)"
・バージョンを省略 "Mozilla(hego)"
・コメントなし "Mozilla"
・プロダクト、コメントは何個でも書ける "Mozilla Firefox/abc(hoge)(hage) Gecko/def"
コメントの文字列の記法には決まりはないのですが、慣例としてセミコロンで区切った情報を記述することが多いようなので、セミコロンをデリミタにして分割します。
とまあ以上の話までは実装しましたが、これってパースする部分だけなので特に何かをしているわけではありません。肝心の分類方法をこれから考えないとねえ…。
(※)k文字だけ先読みするパーサをLL(k) パーサというらしい。今回書くパーサはLL(1) パーサですね。
< | 2007 | > | ||||
<< | < | 10 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | - | - | - |
合計:
本日: