CodeZine(コードジン)

特集ページ一覧

[PHPプロ!] 【dotvoid.com】 シンプルなUserAgentパーサーのサンプル

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/01/31 11:30

dotvoid.comにてシンプルなUserAgent文字列のパーサーが紹介されています。UserAgentとは、Webページをみている端末の情報を表した文字列で、これを見ることで使用しているWebブラウザの種類やバージョン、携帯端末かどうか、検索エンジンのボットかどうかも調べることができます。

 dotvoid.comにてシンプルなUserAgent文字列のパーサーが紹介されています。

 UserAgentとは、Webページをみている端末の情報を表した文字列で、これを見ることで使用しているWebブラウザの種類やバージョン、携帯端末かどうか、検索エンジンのボットかどうかも調べることができます。

 PHPでは $_SERVER['HTTP_USER_AGENT']; でUserAgentを取得することができますが、以下の例のように一つの文字列に全ての情報が詰め込まれているため、プログラムで利用するには使いづらい面もあります。

 dotvoid.comの記事で紹介している関数は、このUserAgentの文字列を解析し、配列に分割してくれるものです。

 Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

 たとえば、上記のUserAgentをこのparseUserAgent関数に渡すと以下のような結果を返してくれます。

Array ( 
[0] => Firefox 
[1] => 2.0.0.1 
)

 記事の作者自身、満足のいく出来ではないと言っているように、ほんとに単純な結果しか出力してくれません。

 さらに詳しいUserAgentパーサーを作ってみたい方はこれを参考にしてみてはいかがでしょうか。

 以下がそのソースコードです。

function parseUserAgent($ua)
  {

    $userAgent = array();
    $agent = $ua;
    $products = array();

    $pattern  = "([^/[:space:]]*)" . "(/([^[:space:]]*))?"
      ."([[:space:]]*\[[a-zA-Z][a-zA-Z]\])?" . "[[:space:]]*"
      ."(\\((([^()]|(\\([^()]*\\)))*)\\))?" . "[[:space:]]*";

    while( strlen($agent) > 0 )
      {
        if ($l = ereg($pattern, $agent, $a))
          {
            // product, version, comment
            array_push($products, array($a[1],    // Product
                                        $a[3],    // Version
                                        $a[6]));  // Comment
            $agent = substr($agent, $l);
          }
        else
          {
            $agent = "";
          }
      }

    // Directly catch these
    foreach($products as $product)
      {
        switch($product[0])
          {
          case 'Firefox':
          case 'Netscape':
          case 'Safari':
          case 'Camino':
          case 'Mosaic':
          case 'Galeon':
          case 'Opera':
            $userAgent[0] = $product[0];
            $userAgent[1] = $product[1];
            break;
          }
      }

    if (count($userAgent) == 0)
      {
        // Mozilla compatible (MSIE, konqueror, etc)
        if ($products[0][0] == 'Mozilla' &&
            !strncmp($products[0][2], 'compatible;', 11))
          {
            $userAgent = array();
            if ($cl = ereg("compatible; ([^ ]*)[ /]([^;]*).*",
                           $products[0][2], $ca))
              {
                $userAgent[0] = $ca[1];
                $userAgent[1] = $ca[2];
              }
            else
              {
                $userAgent[0] = $products[0][0];
                $userAgent[1] = $products[0][1];
              }
          }
        else
        {
          $userAgent = array();
          $userAgent[0] = $products[0][0];
          $userAgent[1] = $products[0][1];
        }
      }

    return $userAgent;
  } 

 (PHPプロ!

関連リンク

関連ニュース

転載元

 PHPプロ!:最新のPHPニュース

  • LINEで送る
  • このエントリーをはてなブックマークに追加

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5