source: extensions/GrumPluginClasses/classes/GPCUserAgent.class.inc.php @ 17562

Last change on this file since 17562 was 17562, checked in by grum, 12 years ago

bug:2723
+ improve some GPC framework functionnalities

  • Property svn:executable set to *
File size: 24.1 KB
Line 
1<?php
2
3require_once('GPCUserAgent.const.inc.php');
4
5class GPCUserAgent
6{
7  /**
8   * parse a user agent string and return an array of normalized informations
9   *
10   * returned:
11   *  array(
12   *    'os'               => (integer)
13   *    'os_version'       => (string)
14   *    'browser'          => (integer)
15   *    'browser_name'     => (string)
16   *    'browser_type'     => (integer)
17   *    'browser_version'  => (string)
18   *    'engine'           => (integer)
19   *    'engine_version'   => (string)
20   *  )
21   *
22   * @param String $userAgent
23   * @return Array
24   */
25  static public function parse($userAgent)
26  {
27    $returned=array(
28      UA_DATA_OS              => UA_OS_UNKNOWN,
29      UA_DATA_OS_VERSION      => '',
30
31      UA_DATA_BROWSER         => UA_BOT_UNKNOWN,
32      UA_DATA_BROWSER_NAME    => '',
33      UA_DATA_BROWSER_TYPE    => UA_BROWSER_TYPE_UNKNOWN,
34      UA_DATA_BROWSER_VERSION => '',
35
36      UA_DATA_ENGINE          => UA_ENGINE_UNKNOWN,
37      UA_DATA_ENGINE_VERSION  => ''
38    );
39
40    $bot=self::getBot($userAgent);
41    if($bot[UA_DATA_BROWSER]!=='')
42    {
43      $returned[UA_DATA_BROWSER]=$bot[UA_DATA_BROWSER];
44      $returned[UA_DATA_BROWSER_TYPE]=UA_BROWSER_TYPE_CRAWLER;
45      $returned[UA_DATA_BROWSER_VERSION]=str_replace(array(';', '(', ')'), array('', '', ''), $bot[UA_DATA_BROWSER_VERSION]);
46      return($returned);
47    }
48
49    $tmp=self::getBrowser($userAgent);
50    $returned[UA_DATA_BROWSER]=$tmp[UA_DATA_BROWSER];
51    $returned[UA_DATA_BROWSER_TYPE]=GPCUserAgentValues::$UA_BrowserInfo[UA_DATA_BROWSER][$tmp[UA_DATA_BROWSER]][UA_PROP_TYPE];
52    $returned[UA_DATA_BROWSER_VERSION]=str_replace(array(';', '(', ')'), array('', '', ''), $tmp[UA_DATA_BROWSER_VERSION]);
53
54    $tmp=self::getOs($userAgent);
55    $returned[UA_DATA_OS]=$tmp[UA_DATA_OS];
56    $returned[UA_DATA_OS_VERSION]=str_replace(array(';', '(', ')'), array('', '', ''), $tmp[UA_DATA_OS_VERSION]);
57
58    $tmp=self::getEngine($userAgent);
59    $returned[UA_DATA_ENGINE]=$tmp[UA_DATA_ENGINE];
60    $returned[UA_DATA_ENGINE_VERSION]=str_replace(array(';', '(', ')'), array('', '', ''), $tmp[UA_DATA_ENGINE_VERSION]);
61
62    // explicit OS for mobile device override the browser type
63    if($returned[UA_DATA_OS]==UA_OS_BLACKBERRY or
64        $returned[UA_DATA_OS]==UA_OS_SYMBIAN_OS or
65        $returned[UA_DATA_OS]==UA_OS_SYMBOS or
66        $returned[UA_DATA_OS]==UA_OS_ANDROID or
67        $returned[UA_DATA_OS]==UA_OS_IOS) $returned[UA_DATA_BROWSER_TYPE]=UA_BROWSER_TYPE_MOBILE;
68
69    // explicit OS for console device override the browser type
70    if($returned[UA_DATA_OS]==UA_OS_NINTENDO_DS or
71        $returned[UA_DATA_OS]==UA_OS_NINTENDO_WII or
72        $returned[UA_DATA_OS]==UA_OS_SONY_PS3 or
73        $returned[UA_DATA_OS]==UA_OS_SONY_PSP) $returned[UA_DATA_BROWSER_TYPE]=UA_BROWSER_TYPE_CONSOLE;
74
75    return($returned);
76  }
77
78
79  /**
80   * from a user agent array properties, return an array completed with associated
81   * properties
82   *
83   * @param Array $userAgent
84   * @return Array
85   */
86  static public function getProperties($userAgent)
87  {
88    $returned=array();
89    if(isset($userAgent[UA_DATA_BROWSER]) and isset(GPCUserAgentValues::$UA_BrowserInfo[UA_DATA_BROWSER][$userAgent[UA_DATA_BROWSER]]))
90    {
91      $returned[UA_DATA_BROWSER]=$userAgent[UA_DATA_BROWSER];
92      $returned[UA_DATA_BROWSER_NAME]=GPCUserAgentValues::$UA_BrowserInfo[UA_DATA_BROWSER][$userAgent[UA_DATA_BROWSER]][UA_PROP_NAME];
93      $returned[UA_DATA_BROWSER_URL]=GPCUserAgentValues::$UA_BrowserInfo[UA_DATA_BROWSER][$userAgent[UA_DATA_BROWSER]][UA_PROP_URL];
94    }
95
96    if(!isset($userAgent[UA_DATA_BROWSER_TYPE]) and isset($userAgent[UA_DATA_BROWSER]))
97      $userAgent[UA_DATA_BROWSER_TYPE]=GPCUserAgentValues::$UA_BrowserInfo[UA_DATA_BROWSER][$userAgent[UA_DATA_BROWSER]][UA_PROP_TYPE];
98
99    if(isset($userAgent[UA_DATA_BROWSER_TYPE]) and isset(GPCUserAgentValues::$UA_BrowserInfo[UA_DATA_BROWSER_TYPE][$userAgent[UA_DATA_BROWSER_TYPE]]))
100    {
101      $returned[UA_DATA_BROWSER_TYPE]=$userAgent[UA_DATA_BROWSER_TYPE];
102      $returned[UA_DATA_BROWSER_TYPE_NAME]=GPCUserAgentValues::$UA_BrowserInfo[UA_DATA_BROWSER_TYPE][$userAgent[UA_DATA_BROWSER_TYPE]];
103    }
104
105
106    if(isset($userAgent[UA_DATA_OS]) and isset(GPCUserAgentValues::$UA_BrowserInfo[UA_DATA_OS][$userAgent[UA_DATA_OS]]))
107    {
108      $returned[UA_DATA_OS]=$userAgent[UA_DATA_OS];
109      $returned[UA_DATA_OS_NAME]=GPCUserAgentValues::$UA_BrowserInfo[UA_DATA_OS][$userAgent[UA_DATA_OS]][UA_PROP_NAME];
110      $returned[UA_DATA_OS_URL]=GPCUserAgentValues::$UA_BrowserInfo[UA_DATA_OS][$userAgent[UA_DATA_OS]][UA_PROP_URL];
111    }
112
113    if(isset($userAgent[UA_DATA_ENGINE]) and isset(GPCUserAgentValues::$UA_BrowserInfo[UA_DATA_ENGINE][$userAgent[UA_DATA_ENGINE]]))
114    {
115      $returned[UA_DATA_ENGINE]=$userAgent[UA_DATA_ENGINE];
116      $returned[UA_DATA_ENGINE_NAME]=GPCUserAgentValues::$UA_BrowserInfo[UA_DATA_ENGINE][$userAgent[UA_DATA_ENGINE]][UA_PROP_NAME];
117      $returned[UA_DATA_ENGINE_URL]=GPCUserAgentValues::$UA_BrowserInfo[UA_DATA_ENGINE][$userAgent[UA_DATA_ENGINE]][UA_PROP_URL];
118    }
119
120    return($returned);
121  }
122
123
124  /**
125   * return bot properties
126   * if user agent is not a bot, properties are filled with string
127   *
128   * @param String $userAgent : user agent string to parse
129   * @return Array
130   */
131  static private function getBot($userAgent)
132  {
133    $botList=array(
134      '(008)\/(\S*)[\;]'                                => UA_BOT_008,
135      '(abachobot)'                                     => UA_BOT_ABACHOBOT,
136      '(accoona-ai-agent)(?:\/(\S*))*'                  => UA_BOT_ACCOONA_AI_AGENT,
137      '(arachmo)'                                       => UA_BOT_ARACHMO,
138      '(b-l-i-t-z-b-o-t)'                               => UA_BOT_BLITZBOT,
139      '(blitzbot)'                                      => UA_BOT_BLITZBOT,
140      '(bingbot)\/(\S*)[\;]'                            => UA_BOT_MICROSOFT_BING,
141      '(bingbot)(?:\/(\S*))*'                           => UA_BOT_MICROSOFT_BING,
142      '(charlotte)\/(\S*)[\;]'                          => UA_BOT_CHARLOTTE,
143      '(charlotte)(?:\/(\S*))*'                         => UA_BOT_CHARLOTTE,
144      '(cerberian drtrs)\sversion-(\S*)[\)]'            => UA_BOT_CERBERIAN_DRTRS,
145      '(cosmos)\/(\S*)[\_]'                             => UA_BOT_COSMOS,
146      '(covario-ids)(?:\/(\S*))*'                       => UA_BOT_COVARIO_IDS,
147      '(dataparksearch)\/(\S*)[\-]'                     => UA_BOT_DATAPARKSEARCH,
148      '(dataparksearch)(?:\/(\S*))*'                    => UA_BOT_DATAPARKSEARCH,
149      '(gaisbot)\/(\S*)[\(\s]'                          => UA_BOT_GAISBOT,
150      '(google)(?:\/(\S*))*'                            => UA_BOT_GOOGLE,
151      '(googlebot)\/(\S*);'                             => UA_BOT_GOOGLE,
152      '(googlebot)(?:\/(\S*))*'                         => UA_BOT_GOOGLE,
153      '(googlebot-image)(?:\/(\S*))*'                   => UA_BOT_GOOGLE,
154      '(gurujibot)\/(\S*);'                             => UA_BOT_GURUJIBOT,
155      '(gurujibot)(?:\/(\S*))*'                         => UA_BOT_GURUJIBOT,
156      '(holmes)(?:\/(\S*))*'                            => UA_BOT_HOLMES,
157      '(htdig)(?:\/(\S*))*'                             => UA_BOT_HTDIG,
158      '(ia_archiver)\/(\S*)'                            => UA_BOT_IA_ARCHIVER,
159      '(ia_archiver)'                                   => UA_BOT_IA_ARCHIVER,
160      '(iccrawler)'                                     => UA_BOT_ICCRAWLER,
161      '(ichiro)\/(\S*)\('                               => UA_BOT_ICHIRO,
162      '(ichiro)(?:\/(\S*))*'                            => UA_BOT_ICHIRO,
163      '(l.webis)(?:\/(\S*))*'                           => UA_BOT_LWEBIS,
164      '(larbin)'                                        => UA_BOT_LARBIN,
165      '(linkwalker)(?:\/(\S*))*'                        => UA_BOT_LINKWALKER,
166      '(lwp-trivial)(?:\/(\S*))*'                       => UA_BOT_LWPTRIVIAL,
167      '(mabontland)'                                    => UA_BOT_MABONLAND,
168      '(mnogosearch)'                                   => UA_BOT_MNOGOSEARCH,
169      '(mogimogi)(?:\/(\S*))*'                          => UA_BOT_MOGIMOGI,
170      '(morning\spaper)'                                => UA_BOT_MORNINGPAPER,
171      '(netresearchserver)\/(\S*)\('                    => UA_BOT_NETRESEARCHSERVER,
172      '(netresearchserver)(?:\/(\S*))*'                 => UA_BOT_NETRESEARCHSERVER,
173      '(newsgator)(?:\/(\S*))*'                         => UA_BOT_NEWSGATOR,
174      '(ng-search)(?:\/(\S*))*'                         => UA_BOT_NGSEARCH,
175      '(nymesis)(?:\/(\S*))*'                           => UA_BOT_NYMESIS,
176      '(oegp)'                                          => UA_BOT_OEGP,
177      '(pompos)(?:\/(\S*))*'                            => UA_BOT_POMPOS,
178      '(pycurl)(?:\/(\S*))*'                            => UA_BOT_PYCURL,
179      '(qseero)'                                        => UA_BOT_QSEERO,
180      '(sbider)(?:\/(\S*))*'                            => UA_BOT_SBIDER,
181      '(scoutjet)'                                      => UA_BOT_SCOUTJET,
182      '(scrubby)(?:\/(\S*))*'                           => UA_BOT_SCRUBBY,
183      '(searchsight)(?:\/(\S*))*'                       => UA_BOT_SEARCHSIGHT,
184      '(semanticdiscovery)(?:\/(\S*))*'                 => UA_BOT_SEMANTICDISCOVERY,
185
186      '(shoula)'                                        => UA_BOT_SHOULA,
187      '(snappy)(?:\/(\S*))*'                            => UA_BOT_SNAPPY,
188      '(stackrambler)(?:\/(\S*))*'                      => UA_BOT_STACKRAMBLER,
189      '(silk)(?:\/(\S*))*'                              => UA_BOT_SILK,
190      '(teoma)'                                         => UA_BOT_TEOMA,
191      '(tineye)(?:\/(\S*))*'                            => UA_BOT_TINEYE,
192      '(truwogps)(?:\/(\S*))*'                          => UA_BOT_TRUWOGPS,
193      '(updated)(?:\/(\S*))*'                           => UA_BOT_UPDATED,
194      '(voyager)(?:\/(\S*))*'                           => UA_BOT_VOYAGER,
195      '(vyu2)'                                          => UA_BOT_VYU2,
196      '(webcollage)(?:\/(\S*))*'                        => UA_BOT_WEBCOLLAGE,
197      '(yooglifetchagent)(?:\/(\S*))*'                  => UA_BOT_YOOGLIFETCHAGENT,
198      '(zao)(?:\/(\S*))*'                               => UA_BOT_ZAO,
199      '(zealbot)'                                       => UA_BOT_ZEALBOT,
200      '(baiduspider)'                                   => UA_BOT_BAIDU,
201      '(msnbot)\/(\d+(?:\.\d+)*)'                       => UA_BOT_MSN_SEARCH,
202      '(msnbot)\s(\d+(?:\.\d+)*)'                       => UA_BOT_MSN_SEARCH,
203      '(exabot)\/(\d+(?:\.\d+)*)'                       => UA_BOT_EXALEAD,
204      '(gamespyhttp)\/(\d+(?:\.\d+)*)'                  => UA_BOT_GAMESPY,
205      '(gigabot)\/(\d+(?:\.\d+)*)'                      => UA_BOT_GIGABLAST,
206      '(inktomi)'                                       => UA_BOT_INKTOMI,
207      '(Yahoo! Slurp)'                                  => UA_BOT_YAHOO_SEARCH,
208      '(yahooseeker)'                                   => UA_BOT_YAHOO_SEARCH,
209      '\s*([a-z]*(?:bot|spyder|crawl|crawler|spider)[a-z]*)'  => UA_BOT_UNKNOWN
210    );
211
212    $returned=array(
213      UA_DATA_BROWSER => '',
214      //'name' => '',
215      UA_DATA_BROWSER_VERSION => ''
216    );
217
218    $result=array();
219    foreach($botList as $regExp => $crawler)
220    {
221      if(preg_match('/'.$regExp.'/i',$userAgent,$result))
222      {
223        // exclude some case
224        if($crawler==UA_BOT_UNKNOWN and preg_match('/(?:msiecrawler)/i', $userAgent))
225          return($returned);
226
227        $returned=array(
228          UA_DATA_BROWSER => $crawler,
229          //'name' => $result[1], #retrieved from the code
230          UA_DATA_BROWSER_VERSION => isset($result[2])?$result[2]:''
231        );
232        return($returned);
233      }
234    }
235
236    return($returned);
237  }
238
239
240  /**
241   * return browser properties
242   *
243   * @param String $userAgent : user agent string to parse
244   * @return Array
245   */
246  static private function getBrowser($userAgent)
247  {
248    $browserList=array(
249      '(android).*applewebkit.*(?:version\/(\S*))(?:safari)?' => UA_BROWSER_ANDROID_WEBKIT,
250      '(opera mini)\/(\S*)\/'                                 => UA_BROWSER_OPERA_MINI,
251      '(opera mini)\/(\S*)'                                   => UA_BROWSER_OPERA_MINI,
252      '(opera mobi).*(?:version\/(\S*))'                      => UA_BROWSER_OPERA_MOBILE,
253      '(opera mobi)'                                          => UA_BROWSER_OPERA_MOBILE,
254      '(blackberry).*version\/(\S*)'                          => UA_BROWSER_BLACKBERRY,
255      '(blackberry\d*)\/(\S*)'                                => UA_BROWSER_BLACKBERRY,
256      '(blackberry)'                                          => UA_BROWSER_BLACKBERRY,
257      '(bunjalloo)\/(\S*)[\;\(]'                              => UA_BROWSER_BUNJALLOO,
258      '(Fennec)\/(\S*)'                                       => UA_BROWSER_FENNEC,
259      '(gobrowser)\/(\S*)'                                    => UA_BROWSER_GOBROWSER,
260      '(gobrowser)'                                           => UA_BROWSER_GOBROWSER,
261      '(iemobile)\/(\S*)[\;\)]'                               => UA_BROWSER_IEMOBILE,
262      '(iemobile)\s(\S*)[\;\)]'                               => UA_BROWSER_IEMOBILE,
263      '(iris)\/(\S*)'                                         => UA_BROWSER_IRIS,
264      '(maemo browser)\s(\S*)'                                => UA_BROWSER_MAEMO_BROWSER,
265      '(mib)\/(\S*)'                                          => UA_BROWSER_MIB,
266      '(minimo)\/(\S*)'                                       => UA_BROWSER_MINIMO,
267      '(netfront)\/(\S*)'                                     => UA_BROWSER_NETFRONT,
268      '(SEMC-Browser)\/(\S*)'                                 => UA_BROWSER_SEMC,
269      '(teashark)\/(\S*)'                                     => UA_BROWSER_TEASHARK,
270
271      '(playstation 3);\s*(\S*)[\;\)]'                        => UA_BROWSER_PS3,
272      '(playstation 3)'                                       => UA_BROWSER_PS3,
273      '(PSP \(PlayStation Portable\));\s*(\S*)[\;\)]'         => UA_BROWSER_PSP,
274      '(PSP \(PlayStation Portable\));\s*(\S*)'               => UA_BROWSER_PSP,
275
276      '(opera)\/(\S*)\s.*(?:nintendo)'                        => UA_BROWSER_OPERA_WII,
277      '(opera).*(?:version\/(\S*))'                           => UA_BROWSER_OPERA,
278      '(opera)\/(\S*)'                                        => UA_BROWSER_OPERA,
279      '(opera)\s(\S*)'                                        => UA_BROWSER_OPERA,
280      '(shiira)\/(\S*)'                                       => UA_BROWSER_SHIIRA,
281      '(shiira)'                                              => UA_BROWSER_SHIIRA,
282      '(skyfire)\/(\S*)'                                      => UA_BROWSER_SKYFIRE,
283      '(thunderbird)\/(\S*)'                                  => UA_BROWSER_THUNDERBIRD,
284      '(namoroka)\/(\S*)'                                     => UA_BROWSER_NAMOROKA,
285      '(minefield)\/(\S*)'                                    => UA_BROWSER_MINEFIELD,
286      '(lunascape)\/(\S*)'                                    => UA_BROWSER_LUNASCAPE,
287      '(lunascape)\s(\S*)[\;\)]'                              => UA_BROWSER_LUNASCAPE,
288      '(lunascape)\s(.*)[\;\)]'                               => UA_BROWSER_LUNASCAPE,
289      '(lunascape)'                                           => UA_BROWSER_LUNASCAPE,
290      '(arora)\/(\S*)'                                        => UA_BROWSER_ARORA,
291      '(camino)\/(\S*)'                                       => UA_BROWSER_CAMINO,
292      '(kapiko)\/(\S*)'                                       => UA_BROWSER_KAPIKO,
293      '(kazehakase)\/(\S*)'                                   => UA_BROWSER_KAZEHAKAZE,
294      '(chromeplus)\/(\S*)'                                   => UA_BROWSER_CHROMEPLUS,
295      '(chrome)\/(\S*)'                                       => UA_BROWSER_CHROME,
296      '(epiphany)\/(\S*)'                                     => UA_BROWSER_EPIPHANY,
297      '(epiphany)'                                            => UA_BROWSER_EPIPHANY,
298      '(galeon)\/(\S*)'                                       => UA_BROWSER_GALEON,
299      '(orca)\/(\S*)'                                         => UA_BROWSER_ORCA,
300      '(lobo)\/(\S*)'                                         => UA_BROWSER_LOBO,
301      '(seamonkey)\/(\S*)'                                    => UA_BROWSER_SEAMONKEY,
302      '(midori)\/(\S*)'                                       => UA_BROWSER_MIDORI,
303      '(midori)'                                              => UA_BROWSER_MIDORI,
304      '(maxthon)\/(\S*)'                                      => UA_BROWSER_MAXTHON,
305      '(maxthon)\s?(\S*)[\);]'                                => UA_BROWSER_MAXTHON,
306      '(iceape)\/(\S*)'                                       => UA_BROWSER_ICEAPE,
307      '(iceweasel)\/(\S*)'                                    => UA_BROWSER_ICEWEASEL,
308      '(netscape\d?)\/(\S*)'                                  => UA_BROWSER_NETSCAPE,
309      '(navigator)\/(\S*)'                                    => UA_BROWSER_NETSCAPE,
310      '(firebird)\/(\S*)'                                     => UA_BROWSER_FIREBIRD,
311      '(firefox)\/(\S*)'                                      => UA_BROWSER_FIREFOX,
312      '(msie)\s?(\S*)[\);]'                                   => UA_BROWSER_INTERNET_EXPLORER,
313      '(konqueror)\/(\S*)[\);]'                               => UA_BROWSER_KONQUEROR,
314      '(links)\s?\((\S*)[\);]'                                => UA_BROWSER_LINKS,
315      '(lynx)\/(\S*)'                                         => UA_BROWSER_LYNX,
316      '(safari)|version\/(\S*)'                               => UA_BROWSER_SAFARI,
317      '(mozilla)\/(\S*)'                                      => UA_BROWSER_NETSCAPE
318    );
319
320    $returned=array(
321      UA_DATA_BROWSER => UA_BROWSER_UNKNOWN,
322      //'name' => '',
323      UA_DATA_BROWSER_VERSION => ''
324    );
325
326    $result=array();
327    foreach($browserList as $regExp => $browser)
328    {
329      if(preg_match('/'.$regExp.'/i',$userAgent,$result))
330      {
331        //echo print_r($userAgent, true).print_r($result, true);
332        if(is_array($result) and count($result)>=2)
333        {
334          if($browser==UA_BROWSER_SAFARI and preg_match('/iphone|ipad|ipod/i', $userAgent))
335            $browser=UA_BROWSER_SAFARI_MOBILE;
336
337          $returned=array(
338            UA_DATA_BROWSER => $browser,
339            //'name' => $result[1],
340            UA_DATA_BROWSER_VERSION => isset($result[2])?$result[2]:''
341          );
342        }
343        else
344        {
345          $returned=array(
346            UA_DATA_BROWSER => UA_BROWSER_UNKNOWN,
347            //'name' => '',
348            UA_DATA_BROWSER_VERSION => ''
349          );
350        }
351        return($returned);
352      }
353    }
354    return($returned);
355  }
356
357
358  /**
359   * return OS properties
360   *
361   * @param String $userAgent : user agent string to parse
362   * @return Array
363   */
364  static private function getOs($userAgent)
365  {
366    $osList=array(
367      '(android)\s?(\S*)[\;\)]'                               => UA_OS_ANDROID,
368      '(android)\s?(\S*)'                                     => UA_OS_ANDROID,
369      '(linux)'                                               => UA_OS_LINUX,
370      '(freebsd)'                                             => UA_OS_FREEBSD,
371      '(openbsd)'                                             => UA_OS_OPENBSD,
372      '(netbsd)'                                              => UA_OS_NETBSD,
373      '(sunos)'                                               => UA_OS_SUNOS,
374      '(blackberry)\s?([^;.]*);'                              => UA_OS_BLACKBERRY,
375      '(blackberry)'                                          => UA_OS_BLACKBERRY,
376      '(symbianos)'                                           => UA_OS_SYMBIAN_OS,
377      '(symbos)'                                              => UA_OS_SYMBOS,
378      '(windows)\s?(phone\sos\s\S*)[\;\)]'                    => UA_OS_WINDOWS,
379      '(windows)\s?(phone\sos\s\S*)'                          => UA_OS_WINDOWS,
380      '(windows)\s?(ce\s?\S*)[\;\)]'                          => UA_OS_WINDOWS,
381      '(windows)\s?(ce\s?\S*)'                                => UA_OS_WINDOWS,
382      '(windows)\s?(NT\s?\S*)[\;\)]'                          => UA_OS_WINDOWS,
383      '(windows)\s?(NT\s?\S*)'                                => UA_OS_WINDOWS,
384      '(windows)\s?(\S*)[\;\)]'                               => UA_OS_WINDOWS,
385      '(windows)\s?(\S*)'                                     => UA_OS_WINDOWS,
386      '(winnt)'                                               => UA_OS_WINDOWS,
387      '(win98)'                                               => UA_OS_WINDOWS,
388      '(win95)'                                               => UA_OS_WINDOWS,
389      '(mac_powerpc)'                                         => UA_OS_MACINTOSH,
390      '(cpu\siphone\sos)\s?(\S*)'                             => UA_OS_IOS,
391      '(iphone|ipad|ipod);.*(?:cpu\sos\s(\S*))'               => UA_OS_IOS,
392      '(mac\sos\sx)\s(\S*)[\;\)]'                             => UA_OS_MAC_OS_X,
393      '(mac\sos\sx)\s(\S*)'                                   => UA_OS_MAC_OS_X,
394      '(mac\sos\sx)'                                          => UA_OS_MAC_OS_X,
395      '(nintendo\swii).*;\s([0-9\-]*);'                       => UA_OS_NINTENDO_WII,
396      '(playstation\s3)'                                      => UA_OS_SONY_PS3,
397      '(playstation\sportable)'                               => UA_OS_SONY_PSP,
398      '(nintendo\sds)'                                        => UA_OS_NINTENDO_DS,
399      '(cros)(?:\s*i\d*)(?:\s(\S*))'                          => UA_OS_CHROME_OS,
400      '(cros)'                                                => UA_OS_CHROME_OS,
401      '(beos)'                                                => UA_OS_BE_OS,
402      '(dragonfly)'                                           => UA_OS_DRAGONFLY,
403      '(unix)'                                                => UA_OS_UNIX,
404      '(darwin)'                                              => UA_OS_DARWIN,
405      '(macintosh)'                                           => UA_OS_MACINTOSH,
406      '(fedora)'                                              => UA_OS_LINUX,
407      '(os\/2).*(warp(?:\s\S*));'                             => UA_OS_OS2,
408      '(os\/2)'                                               => UA_OS_OS2,
409      '(amigaos)(?:\s(\S*))'                                  => UA_OS_AMIGAOS,
410      '(amigaos)'                                             => UA_OS_AMIGAOS
411    );
412
413    $returned=array(
414      UA_DATA_OS => UA_OS_UNKNOWN,
415      //'name' => '',
416      UA_DATA_OS_VERSION => ''
417    );
418
419    $result=array();
420    foreach($osList as $regExp => $os)
421    {
422      if(preg_match('/'.$regExp.'/i',$userAgent,$result))
423      {
424        $returned=array(
425          UA_DATA_OS => $os,
426          //'name' => $result[1],
427          UA_DATA_OS_VERSION => isset($result[2])?$result[2]:''
428        );
429        switch($os)
430        {
431          case UA_OS_WINDOWS:
432            switch($returned[UA_DATA_OS_VERSION])
433            {
434              case 'NT 5.0':
435                  $returned['version']='2000';
436                break;
437              case 'NT 5.1':
438                  $returned['version']='XP';
439                break;
440              case 'NT 5.2':
441                  $returned['version']='Server 2003';
442                break;
443              case 'NT 6.0':
444                  $returned['version']='Vista';
445                break;
446              case 'NT 6.1':
447                  $returned['version']='Seven';
448                break;
449              default;
450                break;
451            }
452            break;
453        }
454
455        return($returned);
456      }
457    }
458
459    return($returned);
460  }
461
462  /**
463   * return engine properties
464   *
465   * @param String $userAgent : user agent string to parse
466   * @return Array
467   */
468  static private function getEngine($userAgent)
469  {
470    $engineList=array(
471      '(presto)(?:\/(\S*))*'           => UA_ENGINE_PRESTO,
472      '(applewebkit)(?:\/(\S*))*'      => UA_ENGINE_APPLEWEBKIT,
473      '(webkit)(?:\/(\S*))*'           => UA_ENGINE_WEBKIT,
474      '(khtml)(?:\/(\S*))*'            => UA_ENGINE_KHTML,
475      '(gecko)(?:\/(\S*))*'            => UA_ENGINE_GECKO,
476      '(trident)(?:\/(\S*))*'          => UA_ENGINE_TRIDENT
477    );
478
479    $returned=array(
480      UA_DATA_ENGINE => UA_ENGINE_UNKNOWN,
481      //'name' => '',
482      UA_DATA_ENGINE_VERSION => ''
483    );
484
485    $result=array();
486    foreach($engineList as $regExp => $engine)
487    {
488      if(preg_match('/'.$regExp.'/i',$userAgent,$result))
489      {
490        $returned=array(
491          UA_DATA_ENGINE => $engine,
492          //'name' => $result[1],
493          UA_DATA_ENGINE_VERSION => isset($result[2])?$result[2]:''
494        );
495        return($returned);
496      }
497    }
498
499    return($returned);
500  }
501} // GPCUserAgent class
502
503
504?>
Note: See TracBrowser for help on using the repository browser.