WebAPI
[ class tree: WebAPI ] [ index: WebAPI ] [ all elements ]

Source for file WebAPI_Browser.php

Documentation is available at WebAPI_Browser.php

  1. <?php
  2. /**
  3.  * Project: WebAPI_Browser :: Get browser information
  4.  * File:    WebAPI/WebAPI_Browser.php
  5.  *
  6.  * WebAPI_Browser class는 Browser의 정보를 구한다.
  7.  *
  8.  * @category    HTTP
  9.  * @package     WebAPI
  10.  * @subpackage  WebAPI_Browser
  11.  * @author      JoungKyun.Kim <http://oops.org>
  12.  * @copyright   (c) 2018, OOPS.org
  13.  * @license     BSD License
  14.  * @link        http://pear.oops.org/package/WebAPI
  15.  * @filesource
  16.  * @since       1.0.2
  17.  */
  18.  
  19. /**
  20.  * Get browser information
  21.  *
  22.  * WebAPI_Browser class는 Browser의 정보를 구한다.
  23.  *
  24.  * @package     WebAPI
  25.  */
  26. Class WebAPI_Browser {
  27.     /**
  28.      * 브라우저 정보를 구함
  29.      *
  30.      * @access public
  31.      * @param string (optional) User Agent를 강제로 지정할 경우 사용
  32.      * @return stdClass 
  33.      */
  34.     static public function exec ($u null{
  35.         if $u )
  36.             $_SERVER['HTTP_USER_AGENT'$u;
  37.         $ua &$_SERVER['HTTP_USER_AGENT'];
  38.  
  39.         $br self::initVar ();
  40.  
  41.         self::OS ($br$ua);
  42.         self::LANGUAGE ($br$ua);
  43.         self::isMobile ($br$ua);
  44.  
  45.         if preg_match ('/Konqueror/'$ua) ) {
  46.             $br->name 'Konqueror';
  47.             $br->engine $br->name;
  48.             if preg_match ('/Konqueror\/([0-9]+(\.[0-9]+)?)/'$ua$m) )
  49.                 $br->version $m[1];
  50.         }
  51.  
  52.         else if preg_match ('/Edge\//'$ua) ) {
  53.             $br->name 'Edge';
  54.             if preg_match ('/Edge\/([0-9]+(\.[0-9]+)?)/'$ua$m) ) {
  55.                 $br->version $m[1];
  56.                 $br->engine 'Spartan';
  57.             }
  58.         }
  59.  
  60.         else if preg_match ('/Chrome|CriOS|CrMo/'$ua) ) {
  61.             $br->name 'Chrome';
  62.             if preg_match ('/(Chrome|CriOS|CrMo)\/([0-9]+(\.[0-9]+)?)/'$ua$m) ) {
  63.                 $br->version $m[2];
  64.                 $br->engine ($m[227'Blink' 'WebKit';
  65.             }
  66.         }
  67.  
  68.         else if preg_match ('/Safari|AppleWebKit/'$ua) ) {
  69.             $br->name 'Safari';
  70.             $br->engine 'WebKit';
  71.             if preg_match ('/Safari\/([0-9]+(\.[0-9]+)?)/'$ua$m) )
  72.                 $br->version $m[1];
  73.         }
  74.  
  75.         else if preg_match ('/KHTML/'$ua) ) {
  76.             $br->name 'KHTML';
  77.             $br->engine $br->name;
  78.             if preg_match ('/KHTML\/([0-9]+(\.[0-9]+)?)/'$ua$m) )
  79.                 $br->version $m[1];
  80.         }
  81.  
  82.         else if preg_match ('/BlackBerry/'$ua) ) {
  83.             $br->name 'BlackBerry';
  84.             $br->engine 'BlackBerry';
  85.         }
  86.  
  87.         else if preg_match ('/MSIE|Trident/'$ua) ) {
  88.             $br->name 'IE';
  89.             $br->engine 'IE';
  90.  
  91.             if preg_match ('/MSIE ([0-9]+(\.[0-9]+)?)/'$ua$m) ) {
  92.                 $br->version $m[1];
  93.  
  94.                 if $br->ostype == 'Mac' && $br->version )
  95.                     $br->engine 'Tasman';
  96.                 else if $br->version )
  97.                     $br->engine 'Trident';
  98.             else {
  99.                 if preg_match ('/rv:([0-9]+(\.[0-9]+)?)/'$ua$m) )
  100.                     $br->version $m[1];
  101.                 $br->engine 'Trident';
  102.             }
  103.         }
  104.  
  105.         else if preg_match ('/Netscape|Mozilla\/[1-4]\.([1-9]|[0-9][1-9])/i'$ua) ) {
  106.             $br->name 'Netscase';
  107.             if preg_match ('/Gekco/'$ua) )
  108.                 $br->engine 'Gekco';
  109.             else
  110.                 $br->engine 'Netscape';
  111.  
  112.             if preg_match ('/Netscape[0-9]?\/([0-9]+(\.[0-9]+)?)/'$ua$m) ) {
  113.                 $br->version $m[1];
  114.             }
  115.         }
  116.  
  117.         else if preg_match ('/Gecko|Galeon/i'$ua) ) {
  118.             if preg_match ('/Firefox/'$ua) )
  119.                 $br->name 'Firefox';
  120.             else
  121.                 $br->name 'Mozilla';
  122.  
  123.             if $br->name == 'Mozilla' && preg_match ('/Thunderbird/'$ua) )
  124.                 $br->name 'Thunderbird';
  125.  
  126.             $br->engine 'Gecko';
  127.  
  128.             switch ($br->name{
  129.                 case 'Firefox' :
  130.                 case 'Thunderbird' :
  131.                     if preg_match ('/(Firefox|Thunderbird)\/([0-9]+(\.[0-9]+(\.[0-9]+)?)?)/'$ua$m) )
  132.                         $br->version $m[2];
  133.                     break;
  134.                 default :
  135.                     if preg_match ('/rv:([0-9]+(\.[0-9]+(\.[0-9]+)?)?)/'$ua$m) )
  136.                         $br->version $m[1];
  137.             }
  138.         }
  139.  
  140.         else if preg_match ('/(Lynx|w3m|Links)/i'$ua$m) ) {
  141.             $br->name $m[1];
  142.             $br->engine $br->name;
  143.             $br->text true;
  144.         }
  145.  
  146.         else if preg_match ('/Opera/'$ua) ) {
  147.             $br->name 'Opera';
  148.  
  149.             // version
  150.             // 7~14 Presto
  151.             // 15+ Blink
  152.             if preg_match ('/Opera\/([0-9.]+)/'$ua$m) ) {
  153.                 $br->version $m[1];
  154.  
  155.                 if $br->version && $br->version 15 )
  156.                     $br->engine 'Presto';
  157.                 else
  158.                     $br->engine 'Blink';
  159.             else {
  160.                 if preg_match ('/Presto/'$ua) )
  161.                     $br->engine 'Presto';
  162.                 else
  163.                     $br->engine 'Blink';
  164.             }
  165.         }
  166.  
  167.         return $br;
  168.     }
  169.  
  170.     /**
  171.      * 브라우저 OS 정보
  172.      *
  173.      * @access public
  174.      */
  175.     static public function OS (&$v$ua null{
  176.         if $ua == null )
  177.             $ua &$_SERVER['HTTP_USER_AGENT'];
  178.  
  179.         if preg_match ('/Linux|Android|J2ME/'$ua) )
  180.             self::LINUX ($v);
  181.         else if preg_match ('/Mac|iPhone|iPad/'$ua) )
  182.             self::MAC ($v);
  183.         else if preg_match ('/BlackBerry/'$ua) )
  184.             self::BLACKBERRY ($v);
  185.         else if preg_match ('/Win/'$ua) )
  186.             self::WINDOWS ($v);
  187.         else if preg_match ('/RIM Tablet OS ([0-9.]+)/'$ua$m) ) {
  188.             $v->os 'RIM' $m[1];
  189.             $v->ostype 'RIM';
  190.         else if preg_match ('/SymOS/'$ua) ) {
  191.             $v->os 'Symbian';
  192.             $v->ostype 'Nokia';
  193.         }
  194.     }
  195.  
  196.     /**
  197.      * 브라우저 언어 정보
  198.      *
  199.      * @access public
  200.      */
  201.     static public function LANGUAGE (&$v$ua null{
  202.         if $ua == null )
  203.             $ua &$_SERVER['HTTP_USER_AGENT'];
  204.  
  205.         if preg_match ('/([a-z]{2})[-_]([a-zA-Z]{2})/'$ua$m) ) {
  206.             if preg_match ('/([a-z]{2}); rv/i'$ua$m) )
  207.                 if $m[1!= 'le' )
  208.                     $v->lang $m[1];
  209.             return;
  210.         }
  211.  
  212.         if $m[1!= 'le' )
  213.             $v->lang $m[1];
  214.     }
  215.  
  216.     /**
  217.      * 모바일 브라우저 여부
  218.      *
  219.      * @access public
  220.      */
  221.     static public function isMobile (&$v$ua null{
  222.         if $ua == null )
  223.             $ua &$_SERVER['HTTP_USER_AGENT'];
  224.  
  225.         if isset ($v->mobile) )
  226.             $v->mobile false;
  227.  
  228.         $re =
  229.             '/Mobile|iPhone|iPad|Android|BlackBerry| RIM |' .
  230.             'Tablet|Fennec|Opera mobi|dows CE|HTC/i';
  231.  
  232.         if preg_match ($re$ua) )
  233.             $v->mobile true;
  234.  
  235.         if $v->mobile && preg_match ('/Android|iOS|Symbian/i'$ua) )
  236.             $v->mobile true;
  237.  
  238.         if $v->mobile === true && preg_match ('/Windows/'$v->ostype) )
  239.             $v->ostype 'Windows Mobile';
  240.     }
  241.  
  242.     // {{{ +-- private (void) initVar (&$br)
  243.     /**
  244.      * 변수 초기화
  245.      *
  246.      * @access private
  247.      * @param stdClass 초기화할 stdClass property
  248.      */
  249.     static public function initVar ({
  250.         return (object) array (
  251.             'name'    => 'Unknwon',
  252.             'os'      => 'Unknwon',
  253.             'ostype'  => 'Unknown',
  254.             'lang'    => 'en',
  255.             'version' => 'Unknown',
  256.             'engine'  => 'Unknwon',
  257.             'text'    => false,
  258.             'mobile'  => false
  259.         );
  260.     }
  261.     // }}}
  262.  
  263.     // {{{ +-- private WINDOWS (&$v)
  264.     private function WINDOWS (&$v$ua null{
  265.         if $ua == null )
  266.             $ua &$_SERVER['HTTP_USER_AGENT'];
  267.  
  268.         # Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
  269.  
  270.         // Firefox Mobile
  271.         if preg_match ('/Fennec/'$ua) ) {
  272.             preg_match ('/NT ([0-9])/'$ua);
  273.             $v->os 'CE';
  274.             $v->ostype 'Windows Mobile';
  275.             return;
  276.         }
  277.  
  278.         if preg_match ('/Windows (Phone|CE)/'$ua) ) {
  279.             if preg_match ('/Windows Phone (OS )?([0-9.]+)/'$ua$m) )
  280.                 $v->os 'Phone ' $m[2];
  281.             else if preg_match ('/Phone|CE/'$ua$m) )
  282.                 $v->os $m[0];
  283.             else
  284.                 $v->os 'Windows';
  285.  
  286.             $v->ostype 'Windows';
  287.             return;
  288.         }
  289.  
  290.         if preg_match ('/NT/'$ua) ) {
  291.             preg_match ('/NT ([\d]+\.[\d]+)/'$ua$m);
  292.  
  293.             switch ($m[1]{
  294.                 case '5.0' :
  295.                     $v->os '2000';
  296.                     break;
  297.                 case '5.1' :
  298.                     $v->os 'XP';
  299.                     break;
  300.                 case '5.2' :
  301.                     $v->os '2003';
  302.                     break;
  303.                 case '6.0' :
  304.                     $v->os 'Vista';
  305.                     break;
  306.                 case '6.1' :
  307.                     $v->os '7';
  308.                     break;
  309.                 case '6.2' :
  310.                     $v->os '8';
  311.                     break;
  312.                 case '6.3' :
  313.                     $v->os '8.1';
  314.                     break;
  315.                 case '10.0' :
  316.                     $v->os '10';
  317.                     break;
  318.                 default :
  319.                     $v->os 'NT';
  320.             }
  321.             $v->ostype 'Windows NT';
  322.  
  323.             return;
  324.         }
  325.  
  326.         if preg_match ('/Win/'$ua) ) {
  327.             $v->os 'Windows';
  328.             $v->ostype 'Windows';
  329.             return;
  330.         }
  331.  
  332.         $v->os 'Windows ?';
  333.         $v->ostype 'Windows';
  334.     }
  335.     // }}}
  336.  
  337.     // {{{ +-- private LINUX (&$v)
  338.     private function LINUX (&$v$ua null{
  339.         if $ua == null )
  340.             $ua &$_SERVER['HTTP_USER_AGENT'];
  341.         $v->ostype 'Linux';
  342.  
  343.         if preg_match ('/Android[- ][0-9].[0-9]/'$ua$m) ) {
  344.             $v->os preg_replace ('/roid /''roid-'$m[0]);
  345.             return;
  346.         else if preg_match ('/Android|J2ME/'$ua$m) ) {
  347.             $v->os 'Android';
  348.             return;
  349.         }
  350.  
  351.         if preg_match ('/Linux ([0-9]+\.[0-9]+)/'$ua$m) )
  352.             $v->os $m[0];
  353.         else
  354.             $v->os 'Linux';
  355.  
  356.         if preg_match ('/Ubuntu/'$ua) )
  357.             $v->os 'Ubuntu';
  358.         else if preg_match ('/armv/'$ua) )
  359.             $v->os 'Android';
  360.     }
  361.     // }}}
  362.  
  363.     // {{{ +-- private MAC (&$v)
  364.     private function MAC (&$v$ua null{
  365.         if $ua == null )
  366.             $ua &$_SERVER['HTTP_USER_AGENT'];
  367.  
  368.         if preg_match ('/iPhone|iPad/'$ua$m) ) {
  369.             $v->ostype $m[0];
  370.             if preg_match ('/OS ([0-9]+)/'$ua$m) )
  371.                 $v->os 'iOS' $m[1];
  372.             else
  373.                 $v->os 'iOS';
  374.         else {
  375.             $v->os 'Mac OS';
  376.             $v->ostype 'Mac';
  377.         }
  378.     }
  379.     // }}}
  380.  
  381.     // {{{ +-- private BLACKBERRY (&$v)
  382.     private function BLACKBERRY (&$v{
  383.         $ua &$_SERVER['HTTP_USER_AGENT'];
  384.  
  385.         $ua preg_replace ('/[^0-9]+\//''/'$ua);
  386.         if preg_match ('/BlackBerry([0-9]+)\/([0-9]+\.[0-9]+)/'$ua$m) ) {
  387.             $v->os 'BlackBerry' $m[2];
  388.             $v->version $m[1];
  389.         else
  390.             $v->os 'BlackBerry';
  391.         $v->ostype 'BlackBerry';
  392.     }
  393.     // }}}
  394. }
  395.  
  396. /*
  397.  * Local variables:
  398.  * tab-width: 4
  399.  * c-basic-offset: 4
  400.  * End:
  401.  * vim: set filetype=php noet sw=4 ts=4 fdm=marker:
  402.  * vim600: noet sw=4 ts=4 fdm=marker
  403.  * vim<600: noet sw=4 ts=4
  404.  */
  405. ?>

Documentation generated on Tue, 14 May 2019 02:00:49 +0900 by phpDocumentor 1.4.4