SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CodeZineニュース

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

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

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

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ニュース

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
この記事の著者

PHPプロ!(PHPプロ!)

PHPプロ!」は、アシアル株式会社が運営するPHP開発者のためのポータル&コミュニティサイトです。同サイトでは、PHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座、PHP中級者のためのTIPSメーリングリスト、中・上級者向けの技術ノウハウ満載のPHPプロ!マガジンの提供など、PHP開発...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/947 2007/02/07 19:21

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング