digitorum.ru

Как меня найти

Профиль

icq: 4415944

User-Agent: Определяем мобильное устройство.

php

Возникла потребность подсовывать пользователю разный контент в зависимости от того, с какого устройства он пришел на сайт (не спрашивайте зачем ).

Попробовать определить платформу можно по юзерагенту. Достаточно полный список "мобильных" юзерагентов я нашел на сайте http://www.zytr....

Ну и собственно исходный код класса.

<?php
	
	/*
	*
	* Pavel Ladygin / http://digitorum.ru
	*
	* Free for use.
	* 
	* thnx to http://www.zytrax.com/
	*
	*/
	
	Class Mobile_Checker {
		
		/*
		* юзерагент для проверки
		*/
		private $userAgent = '';
		
		/*
		* Поллученные заголовки
		*/ 
		private $httpAccept = '';
		
		/*
		* "Найденное" мобильное устройство
		*/
		private $mobileDetected = null;
		
		/*
		* Юзерагенты для известных платформ
		*/
		private $mobileUserAgentsPatterns = array();
		
		/*
		* конструктор, на вход принимаем юзерагент и заголовки ( $_SERVER['HTTP_ACCEPT'] )
		*/
		public function __construct($userAgent = '', $httpAccept = '') {
			$this->userAgent = $userAgent;
			$this->httpAccept = $httpAccept;
			
			/*
			* Заполняем паттерны
			*/
			$this->mobileUserAgentsPatterns = array(
				'Windows Phone 7' => '#(zunewp7|xblwp7|windows phone os 7)#i',
				'Windows Mobile' => '#(iris|3g_t|windows ce|iemobile|windows phone 6|windows mobile/6)#i',
				'Playstation' => '#(playstation|psp )#i',
				'Android' => '#android#i',
				'iPhone' => '#iPhone#i',
				'iPad' => '#ipad#i',
				'iPod' => '#ipod#i',
				'Kindle' => '#kindle#i',
				'Blackberry' => '#blackberry#i',
				'Palm' => '#(palm os|palmos|palm|hiptop|avantgo|plucker|xiino|blazer|elainepre/)#i',
				'Opera Mini/Opera Mobile' => '#opera mini|opera mobi#i',
				'Unknown Mobile' => '#(' . implode('|', 
										array(
											'sam\-',
											'samsung(\-|;)',
											'mobileexplorer',
											'nokia',
											'hp ipaq',
											'htc(_|\-)',
											'lg(\-|/)',
											'lge(\-| )',
											'mot(\-| )',
											'160x',
											'x160',
											'480x640',
											'240x400',
											'240x320',
											'600x800',
											'sonyericsson',
											'phone',
											'sanyo',
											'rim8',
											'mob-x',
											'bolt/',
											'docomo',
											'up\.browser',
											'up\.link',
											'vodafone',
											'j\-phone',
											'nook browser',
											'armv5tejl;',
											'armv6l;',
											'symbian',
											'smartphone;',
											'wap;',
											'wap browser',
											'opera mobi',
											'tablet pc',
											'tablet os',
											'wireless',
											'touchpad',
											'ddipocket;',
											'pdxgw/',
											'astel/',
											'dolphin',
											'minimo/',
											'plucker/',
											'pda; ',
											'netfront/',
											'wm5 pie',
											't\-mobile',
											'o2',
											'cricket',
											'ec-sgh'
										)
									) . ')#i'
			);
		}
		
		/*
		* Прасим юзерагент
		*/
		public function Check() {
			// проверяем юзерагент по паттернам
			if($this->userAgent) {
				foreach($this->mobileUserAgentsPatterns as $mobileKey => $pattern) {
					if(preg_match($pattern, $this->userAgent)) {
						$this->mobileDetected = $mobileKey;
						return;
					}
				}
			}
			
			// если дошли до сюда - проверяем заголовки (если они есть)
			if($this->httpAccept) {
				if(strpos($this->httpAccept, '/vnd.wap') !== false) {
					$this->mobileDetected = 'Unknown Mobile';
					return;
				}
			}
			
			// если до сюда дошли, проверяем массив _SERVER
			if(isset($_SERVER) && ( isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE']) ) ) {
				$this->mobileDetected = 'Unknown Mobile';
				return;
			}
			
			// если ничего найти не получилось - значит не мобильное устройство
			$this->mobileDetected = '';
			
		}
		
		/*
		* Магический метод __call (заворачиваем на проверку платформы)
		*/
		public function __call($name, $arguments) {
			if($this->mobileDetected === null) {
				$this->Check();
			}
			$name = strtolower($name);
			switch($name) {
				case 'mobileplatform' : 
					return $this->mobileDetected;
					break;
				case 'ismobile' :
					if($this->mobileDetected) {
						return true;
					}
					return false;
					break;
				case 'ispc' :
				case 'isdesctop' :
					if(!$this->mobileDetected) {
						return true;
					}
					return false;
					break;
				default : 
					if($this->mobileDetected) {
						$currentPlatformName = 'is' . preg_replace('/\s/', '', strtolower($this->mobileDetected));
						if($name == $currentPlatformName) {
							return true;
						}
					}
					return false;
					break;
			}
		}
		
	}
	
?>

 

И, конечно же, пример использования:

<?php

	$mobilechecker = new Mobile_Checker($_SERVER['HTTP_USER_AGENT'], $_SERVER['HTTP_ACCEPT']);
	var_export($mobilechecker->isPC());
	if($mobilechecker->isMobile() && $mobilechecker->isWindowsPhone7()) {
		print $mobilechecker->MobilePlatform();
	}

?>

 

Методы isМобильнаяПлатформа "определяются" (см. магический метод __call) по ключам массива $mobileUserAgentsPatterns, который заполняется в конструкторе.

Обновления на GitHub.

Возможно будет интересно: