@@ -173,111 +173,89 @@ class web_analytics {
173173 private $ u_bot = 0 ;
174174
175175 function analyse_user_agent ($ user_agent ) {
176- $ result = array ("browser " => array ("name " => null , "version " => null ), "os " => array ("name " => null , "version " => null ), "device " => array ("name " => null ));
177- $ gecko = false ;
178- if (preg_match ("/Mozilla\/\d[\d.]* \([A-Za-z0-9_.\- ;:\/]*\) Gecko\/\d+/i " , $ user_agent )) {
179- $ gecko = true ;
180- }
181- $ webkit = false ;
182- if (preg_match ("/Mozilla\/\d[\d.]* \([A-Za-z0-9_.\- ;:\/]*\) AppleWebKit\/\d[\d.]* \(KHTML, like Gecko\)/i " , $ user_agent )) {
183- $ webkit = true ;
184- }
185- $ trident = false ;
176+ $ result = array ();
177+ $ gecko = preg_match ("/Mozilla\/\d[\d.]* \([A-Za-z0-9_.\- ;:\/]*\) Gecko\/\d+/i " , $ user_agent );
178+ $ webkit = preg_match ("/Mozilla\/\d[\d.]* \([A-Za-z0-9_.\- ;:\/]*\) AppleWebKit\/\d[\d.]* \(KHTML, like Gecko\)/i " , $ user_agent );
186179 if (preg_match_all ("/\w+\/\d[\d.]*/ " , $ user_agent , $ matches )) {
187180 $ browser = preg_split ("/\// " ,$ matches [0 ][array_key_last ($ matches [0 ])]);
181+ $ trident = (preg_match ("/trident/i " , $ browser [0 ]) && !$ gecko && !$ webkit );
188182 if ($ webkit ) {
189- if (preg_match ("/safari/i " , $ browser [0 ]) && ( preg_match ( " /chrome/i " , $ user_agent ) || preg_match ( " /crios/i " , $ user_agent )) ) {
183+ if (preg_match ("/safari/i " , $ browser [0 ])) {
190184 $ browser = preg_split ("/\// " ,$ matches [0 ][2 ]);
191- if (preg_match ("/version/i " , $ browser [0 ])) {
192- $ browser = preg_split ("/\// " ,$ matches [0 ][3 ]);
193- }
194- if (!preg_match ("/chrome/i " , $ browser [0 ])) {
195- $ browser [0 ] = "chrome " ;
185+ $ i = 3 ;
186+ while ((preg_match ("/version/i " , $ browser [0 ]) || preg_match ("/mobile/i " , $ browser [0 ])) && isset ($ matches [0 ][$ i ])) {
187+ $ browser = preg_split ("/\// " ,$ matches [0 ][$ i ]);
188+ $ i ++;
196189 }
197190 }
198- } else if (preg_match ("/trident/i " , $ browser [0 ]) && !$ gecko ) {
199- $ trident = true ;
200191 }
201- $ result ["browser " ]["name " ] = $ browser [0 ];
202- $ result ["browser " ]["version " ] = $ browser [1 ];
203192 }
204193 if (preg_match ("/\([A-Za-z0-9_.\- ;:\/]*\)/ " , $ user_agent , $ match )) {
205- $ platform = preg_replace ("/\(/ " , "" , $ match [0 ]);
206- $ platform = preg_replace ("/\)/ " , "" , $ platform );
207- $ platforms = preg_split ("/; / " , $ platform );
208- $ os = null ;
209- $ osv = null ;
194+ $ platforms = preg_split ("/; / " , preg_replace ("/\)/ " , "" , preg_replace ("/\(/ " , "" , $ match [0 ])));
210195 if ($ trident ) {
211196 $ browser = preg_split ("/ / " ,$ platforms [1 ]);
212197 if (preg_match ("/msie/i " , $ browser [0 ])) {
213- $ result ["browser " ]["name " ] = $ browser [0 ];
214- $ result ["browser " ]["version " ] = $ browser [1 ];
215198 $ os = preg_split ("/ \d/ " , preg_replace ("/ nt/i " , "" ,$ platforms [2 ]));
216199 $ osv = preg_split ("/ / " ,$ platforms [2 ]);
217- $ result ["device " ]["name " ] = "pc " ;
200+ if (preg_match ("/xbox/i " , $ platforms [array_key_last ($ platforms )])) {
201+ $ result ["device " ]["name " ] = $ platforms [array_key_last ($ platforms )];
202+ }
218203 } else {
219- $ result [ " browser " ][ " name " ] = "msie " ;
204+ $ browser[ 0 ] = "msie " ;
220205 $ version = preg_split ("/:/ " , $ platforms [array_key_last ($ platforms )]);
221- $ result [ " browser " ][ " version " ] = $ version [1 ];
206+ $ browser[ 1 ] = $ version [1 ];
222207 }
223208 }
224209 if (preg_match ("/windows/i " , $ platforms [0 ])) {
225210 $ os = preg_split ("/ \d/ " , preg_replace ("/ nt/i " , "" ,$ platforms [0 ]));
226211 $ osv = preg_split ("/ / " ,$ platforms [0 ]);
227- $ result ["device " ]["name " ] = "pc " ;
228212 if (preg_match ("/phone/i " , $ os [0 ])) {
229213 $ result ["device " ]["name " ] = $ platforms [array_key_last ($ platforms )-1 ]." " .$ platforms [array_key_last ($ platforms )];
230214 }
231- if (isset ($ platforms [3 ]) && preg_match ("/xbox/i " , $ platforms [3 ])) {
232- $ result ["device " ]["name " ] = $ platforms [3 ];
233- if (isset ($ platforms [4 ])) {
234- $ result ["device " ]["name " ] = $ platforms [4 ];
235- }
215+ if (preg_match ("/xbox/i " , $ platforms [array_key_last ($ platforms )])) {
216+ $ result ["device " ]["name " ] = $ platforms [array_key_last ($ platforms )];
236217 }
237218 } else if (preg_match ("/linux/i " , $ platforms [0 ])) {
238- $ os = preg_split ("/ \d/ " ,$ platforms [1 ]);
239- $ osv = preg_split ("/ / " ,$ platforms [1 ]);
240- if (preg_match ("/android/i " , $ os [0 ]) && preg_match ("/build/i " , $ platforms [2 ])) {
241- $ device = preg_split ("/ build/i " , $ platforms [2 ]);
242- $ result ["device " ]["name " ] = $ device [0 ];
219+ $ i = preg_match ("/u/i " , $ platforms [1 ]) ? 2 : 1 ;
220+ $ os = preg_split ("/ \d/ " ,$ platforms [$ i ]);
221+ if (preg_match ("/android/i " , $ os [0 ])) {
222+ $ osv = preg_split ("/ / " ,$ platforms [$ i ]);
223+ } else {
224+ $ os = preg_split ("/ / " ,$ platforms [0 ]);
243225 }
244- } else if (preg_match ("/linux/i " , $ platforms [1 ])) {
245- $ os = preg_split ("/ / " ,$ platforms [1 ]);
246- if (preg_match ("/x11/i " , $ platforms [0 ])) {
247- $ result ["device " ]["name " ] = "pc " ;
226+ foreach ($ platforms as $ property ) {
227+ if (preg_match ("/build/i " , $ property )) {
228+ $ device = preg_split ("/ build/i " , $ property );
229+ $ result ["device " ]["name " ] = $ device [0 ];
230+ }
248231 }
249- } else if (preg_match ("/cros/i " , $ platforms [1 ])) {
232+ } else if (preg_match ("/linux/i " , $ platforms [ 1 ]) || preg_match ( " / cros/i " , $ platforms [ 1 ]) || preg_match ( " /ubuntu /i " , $ platforms [1 ])) {
250233 $ os = preg_split ("/ / " ,$ platforms [1 ]);
251- $ result ["device " ]["name " ] = "chromebook " ;
252234 } else if (preg_match ("/macintosh/i " , $ platforms [0 ])) {
253235 $ os = preg_split ("/ \d/ " ,preg_replace ("/intel /i " , "" , $ platforms [1 ]));
254236 $ osv = preg_split ("/ / " ,$ platforms [1 ]);
255- $ result ["device " ]["name " ] = " mac " ;
237+ $ result ["device " ]["name " ] = $ platforms [ 0 ] ;
256238 } else if (preg_match ("/iphone/i " , $ platforms [0 ]) || preg_match ("/ipad/i " , $ platforms [0 ]) || preg_match ("/ipod/i " , $ platforms [0 ])) {
257239 $ os = preg_split ("/ \d/ " ,preg_replace ("/cpu /i " , "" , $ platforms [1 ]));
258240 $ osv = preg_split ("/ / " , preg_replace ("/ like mac os x/i " , "" , $ platforms [1 ]));
259241 $ result ["device " ]["name " ] = $ platforms [0 ];
242+ } else if (preg_match ("/android/i " , $ platforms [0 ])) {
243+ $ os = preg_split ("/ \d/ " ,$ platforms [0 ]);
244+ $ osv = preg_split ("/ / " ,$ platforms [0 ]);
245+ $ result ["device " ]["name " ] = $ platforms [1 ];
260246 }
261- $ result ["os " ]["name " ] = isset ($ os ) ? $ os [0 ] : null ;
262- $ result ["os " ]["version " ] = isset ($ osv ) ? $ osv [array_key_last ($ osv )] : null ;
263- }
264- return $ result ;
265- }
266-
267- function check_if_bot () {
268- $ bot_array = array ('/googlebot/i ' => 'Google ' ,
269- '/bingbot/i ' => 'Bing ' ,
270- '/twitterbot/i ' => 'Twitter ' ,
271- '/baiduspider/i ' => 'Baidu ' ,
272- '/yandex/i ' => 'Yandex ' ,
273- '/duckduck/i ' => 'DuckDuckGo ' ,
274- '/archive.org_bot/i ' => 'Archive.org ' );
275- foreach ($ bot_array as $ regex => $ value ) {
276- if (preg_match ($ regex , $ this ->ua )) {
277- return TRUE ;
247+ if (isset ($ os )) {
248+ $ result ["os " ]["name " ] = $ os [0 ];
249+ }
250+ if (isset ($ osv )) {
251+ $ result ["os " ]["version " ] = $ osv [array_key_last ($ osv )];
278252 }
279253 }
280- return FALSE ;
254+ if (isset ($ browser )) {
255+ $ result ["browser " ]["name " ] = $ browser [0 ];
256+ $ result ["browser " ]["version " ] = $ browser [1 ];
257+ }
258+ return $ result ;
281259 }
282260
283261 // Get user language and country from hostname and http header
@@ -433,11 +411,11 @@ function get_agent() {
433411 $ this ->db_manager ->add ("wa_agents " , array (
434412 "id " => $ id ,
435413 "agent " => $ this ->ua ,
436- "browser " => $ uaa ["browser " ]["name " ],
437- "browser_version " => $ uaa ["browser " ]["version " ],
438- "os " => $ uaa ["os " ]["name " ],
439- "os_version " => $ uaa ["os " ]["version " ],
440- "device " => $ uaa ["device " ]["name " ],
414+ "browser " => isset ( $ uaa ["browser " ]["name " ]) ? $ uaa [ " browser " ][ " name " ] : null ,
415+ "browser_version " => isset ( $ uaa ["browser " ]["version " ]) ? $ uaa [ " browser " ][ " version " ] : null ,
416+ "os " => isset ( $ uaa ["os " ]["name " ]) ? $ uaa [ " os " ][ " name " ] : null ,
417+ "os_version " => isset ( $ uaa ["os " ]["version " ]) ? $ uaa [ " os " ][ " version " ] : null ,
418+ "device " => isset ( $ uaa ["device " ]["name " ]) ? $ uaa [ " device " ][ " name " ] : null ,
441419 "mobile " => $ this ->u_mobile ,
442420 "bot " => $ this ->u_bot
443421 ));
@@ -591,7 +569,7 @@ function __construct($db_manager, $server, $cookies, $anonymousips = TRUE) {
591569 } else { $ this ->d = $ domain ; }
592570 }
593571 $ this ->u_mobile = preg_match ('/mobile/i ' , $ this ->ua ) ? 1 : 0 ;
594- $ this ->u_bot = $ this ->check_if_bot ( ) ? 1 : 0 ;
572+ $ this ->u_bot = ( preg_match ( ' /bot/i ' , $ this ->ua ) || preg_match ( ' /crawler/i ' , $ this -> ua ) ) ? 1 : 0 ;
595573 $ this ->u_language = isset ($ this ->s ["HTTP_ACCEPT_LANGUAGE " ]) ? substr ($ this ->s ['HTTP_ACCEPT_LANGUAGE ' ], 0 , 2 ) : null ;
596574 $ this ->u_country_code = $ this ->get_country_code ();
597575 $ this ->check_database ();
0 commit comments