User-Agent文字列にはルールがないため、完全に正確で将来性のあるパーサーを作成する方法はありません。ただし、一般的なパターンがあります:
User-Agent: <engine-string> <engine-string> ...
ここで、engine-string
フォームがあります:
<agent-name> (<comment>; <comment>; ...)
各エンジン文字列(私の理解では、正しくない可能性があります)には、コメントがある場合とない場合があります。
例:
Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) ↲
AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e ↲
Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
(これは単一の文字列です。私はそれを行に分割しました。)誰かがブラウザエンジンのフォークを行うときはいつでも、彼らは自分のことを最後に追加するだけのようです。つまり、iPhone上にあると考える抽象的な「Mozilla」ブラウザ(「FirstBrowserWar」の遺産)があります。次に、WebKitがあることがわかります(これは、かなり前にKHTMLとして生まれたことを覚えています)。次に、バージョン/ 6.0の変更がいくつかあり、それがMobile / 10A5376eに変更され、Safari / 8536.25になりました。これにより、実際にはモバイルGoogleボットであるという秘密が明らかになります。
別の例:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; ↲
InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; ↲
.NET CLR 3.5.30729; .NET CLR 1.1.4322)
これは単一のエンジンですが、括弧内に多くのことが言えます。
したがって、一般的な観察は次のとおりです。
- 最後のエンジンストリングが最も重要です
- 括弧内の最後のコメントはそれほど重要ではありません。
そのことを念頭に置いて、私の考えは、文字列をこれらのエンジンとコメントトークンに解析し、各エンジンセクションから、たとえば5番目から始まるコメントを破棄することです。それでも不十分な場合は、2番目から始まるエンジンセクションを破棄します(最初のセクションは抽象的な「Mozilla」であることがよくありますが、多くの場合有用なコメントがあります。また、特にWebクローラーの場合、実際には具体的なものである場合もあります)。
解析するときは、この形式に従わない文字列が存在する場合があることを考慮する必要があります。後で検査するためにログファイルに保存してから、データベースに合わせて必要な長さにカットするだけです。