mobile-detect 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mobile-detect
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karthik T
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-14 00:00:00.000000000 Z
11
+ date: 2016-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -111,7 +111,8 @@ dependencies:
111
111
  description: Ruby version of a php library of the same name - http://mobiledetect.net/.
112
112
  Intended to be a nearly complete port, sharing data exposed by the php library
113
113
  email: karthikt.holmes+github@gmail.com
114
- executables: []
114
+ executables:
115
+ - mobile_detect
115
116
  extensions: []
116
117
  extra_rdoc_files: []
117
118
  files:
@@ -125,9 +126,10 @@ files:
125
126
  - LICENSE
126
127
  - README.md
127
128
  - Rakefile
129
+ - bin/mobile_detect
130
+ - circle.yml
128
131
  - data/Mobile_Detect.json
129
132
  - data/get_latest_data.sh
130
- - lib/Mobile_Detect.php
131
133
  - lib/mobile-detect.rb
132
134
  - lib/mobile_detect.rb
133
135
  - lib/mobile_detect/core.rb
@@ -156,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
158
  version: '0'
157
159
  requirements: []
158
160
  rubyforge_project:
159
- rubygems_version: 2.2.2
161
+ rubygems_version: 2.5.1
160
162
  signing_key:
161
163
  specification_version: 4
162
164
  summary: Library to detect if the request is made from a mobile device, tablet, etc
@@ -1,1215 +0,0 @@
1
- <?php
2
- /**
3
- * Mobile Detect Library
4
- * =====================
5
- *
6
- * Motto: "Every business should have a mobile detection script to detect mobile readers"
7
- *
8
- * Mobile_Detect is a lightweight PHP class for detecting mobile devices (including tablets).
9
- * It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.
10
- *
11
- * @author Current authors: Serban Ghita <serbanghita@gmail.com>, Nick Ilyin <nick.ilyin@gmail.com>
12
- * Original author: Victor Stanciu <vic.stanciu@gmail.com>
13
- *
14
- * @license Code and contributions have 'MIT License'
15
- * More details: https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt
16
- *
17
- * @link Homepage: http://mobiledetect.net
18
- * GitHub Repo: https://github.com/serbanghita/Mobile-Detect
19
- * Google Code: http://code.google.com/p/php-mobile-detect/
20
- * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md
21
- * HOWTO: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples
22
- *
23
- * @version 2.7.9
24
- */
25
-
26
- class Mobile_Detect
27
- {
28
- /**
29
- * Mobile detection type.
30
- *
31
- * @deprecated since version 2.6.9
32
- */
33
- const DETECTION_TYPE_MOBILE = 'mobile';
34
-
35
- /**
36
- * Extended detection type.
37
- *
38
- * @deprecated since version 2.6.9
39
- */
40
- const DETECTION_TYPE_EXTENDED = 'extended';
41
-
42
- /**
43
- * A frequently used regular expression to extract version #s.
44
- *
45
- * @deprecated since version 2.6.9
46
- */
47
- const VER = '([\w._\+]+)';
48
-
49
- /**
50
- * Top-level device.
51
- */
52
- const MOBILE_GRADE_A = 'A';
53
-
54
- /**
55
- * Mid-level device.
56
- */
57
- const MOBILE_GRADE_B = 'B';
58
-
59
- /**
60
- * Low-level device.
61
- */
62
- const MOBILE_GRADE_C = 'C';
63
-
64
- /**
65
- * Stores the version number of the current release.
66
- */
67
- const VERSION = '2.7.9';
68
-
69
- /**
70
- * A type for the version() method indicating a string return value.
71
- */
72
- const VERSION_TYPE_STRING = 'text';
73
-
74
- /**
75
- * A type for the version() method indicating a float return value.
76
- */
77
- const VERSION_TYPE_FLOAT = 'float';
78
-
79
- /**
80
- * The User-Agent HTTP header is stored in here.
81
- * @var string
82
- */
83
- protected $userAgent = null;
84
-
85
- /**
86
- * HTTP headers in the PHP-flavor. So HTTP_USER_AGENT and SERVER_SOFTWARE.
87
- * @var array
88
- */
89
- protected $httpHeaders = array();
90
-
91
- /**
92
- * The detection type, using self::DETECTION_TYPE_MOBILE or self::DETECTION_TYPE_EXTENDED.
93
- *
94
- * @deprecated since version 2.6.9
95
- *
96
- * @var string
97
- */
98
- protected $detectionType = self::DETECTION_TYPE_MOBILE;
99
-
100
- /**
101
- * HTTP headers that trigger the 'isMobile' detection
102
- * to be true.
103
- *
104
- * @var array
105
- */
106
- protected static $mobileHeaders = array(
107
-
108
- 'HTTP_ACCEPT' => array('matches' => array(
109
- // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/
110
- 'application/x-obml2d',
111
- // BlackBerry devices.
112
- 'application/vnd.rim.html',
113
- 'text/vnd.wap.wml',
114
- 'application/vnd.wap.xhtml+xml'
115
- )),
116
- 'HTTP_X_WAP_PROFILE' => null,
117
- 'HTTP_X_WAP_CLIENTID' => null,
118
- 'HTTP_WAP_CONNECTION' => null,
119
- 'HTTP_PROFILE' => null,
120
- // Reported by Opera on Nokia devices (eg. C3).
121
- 'HTTP_X_OPERAMINI_PHONE_UA' => null,
122
- 'HTTP_X_NOKIA_IPADDRESS' => null,
123
- 'HTTP_X_NOKIA_GATEWAY_ID' => null,
124
- 'HTTP_X_ORANGE_ID' => null,
125
- 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null,
126
- 'HTTP_X_HUAWEI_USERID' => null,
127
- // Reported by Windows Smartphones.
128
- 'HTTP_UA_OS' => null,
129
- // Reported by Verizon, Vodafone proxy system.
130
- 'HTTP_X_MOBILE_GATEWAY' => null,
131
- // Seend this on HTC Sensation. @ref: SensationXE_Beats_Z715e.
132
- 'HTTP_X_ATT_DEVICEID' => null,
133
- // Seen this on a HTC.
134
- 'HTTP_UA_CPU' => array('matches' => array('ARM')),
135
- );
136
-
137
- /**
138
- * List of mobile devices (phones).
139
- *
140
- * @var array
141
- */
142
- protected static $phoneDevices = array(
143
- 'iPhone' => '\biPhone.*Mobile|\biPod', // |\biTunes
144
- 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+',
145
- 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m',
146
- 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile',
147
- // @todo: Is 'Dell Streak' a tablet or a phone? ;)
148
- 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b',
149
- 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925',
150
- 'Samsung' => 'Samsung|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E',
151
- 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)',
152
- 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i',
153
- 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile',
154
- // @ref: http://www.micromaxinfo.com/mobiles/smartphones
155
- // Added because the codes might conflict with Acer Tablets.
156
- 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b',
157
- 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; @todo - complete the regex.
158
- 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;)
159
- // @ref: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH)
160
- // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android.
161
- 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790',
162
- // @ref: http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones.
163
- 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250',
164
- 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)',
165
- // Added simvalley mobile just for fun. They have some interesting devices.
166
- // @ref: http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html
167
- 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b',
168
- // @Tapatalk is a mobile app; @ref: http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039
169
- 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser'
170
- );
171
-
172
- /**
173
- * List of tablet devices.
174
- *
175
- * @var array
176
- */
177
- protected static $tabletDevices = array(
178
- 'iPad' => 'iPad|iPad.*Mobile', // @todo: check for mobile friendly emails topic.
179
- 'NexusTablet' => '^.*Android.*Nexus(((?:(?!Mobile))|(?:(\s(7|10).+))).)*$',
180
- 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-I9205|GT-P5200|GT-P5210|SM-T311|SM-T310|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T520|SM-T525',
181
- // @reference: http://www.labnol.org/software/kindle-user-agent-string/20378/
182
- 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE)\b',
183
- // Only the Surface tablets with Windows RT are considered mobile.
184
- // @ref: http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx
185
- 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;',
186
- // @ref: http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT
187
- 'HPTablet' => 'HP Slate 7|HP ElitePad 900|hp-tablet|EliteBook.*Touch',
188
- // @note: watch out for PadFone, see #132
189
- 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|TX201LA',
190
- 'BlackBerryTablet' => 'PlayBook|RIM Tablet',
191
- 'HTCtablet' => 'HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200',
192
- 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617',
193
- 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2',
194
- // @ref: http://www.acer.ro/ac/ro/RO/content/drivers
195
- // @ref: http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer)
196
- // @ref: http://us.acer.com/ac/en/US/content/group/tablets
197
- // @note: Can conflict with Micromax and Motorola phones codes.
198
- 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810)\b|W3-810|\bA3-A10\b',
199
- // @ref: http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/
200
- // @ref: http://us.toshiba.com/tablets/tablet-finder
201
- // @ref: http://www.toshiba.co.jp/regza/tablet/
202
- 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO',
203
- // @ref: http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html
204
- 'LGTablet' => '\bL-06C|LG-V900|LG-V500|LG-V909\b',
205
- 'FujitsuTablet' => 'Android.*\b(F-01D|F-05E|F-10D|M532|Q572)\b',
206
- // Prestigio Tablets http://www.prestigio.com/support
207
- 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD',
208
- // @ref: http://support.lenovo.com/en_GB/downloads/default.page?#
209
- 'LenovoTablet' => 'IdeaTab|S2110|S6000|K3011|A3000|A1000|A2107|A2109|A1107|ThinkPad([ ]+)?Tablet',
210
- // @ref: http://www.yarvik.com/en/matrix/tablets/
211
- 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b',
212
- 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB',
213
- 'ArnovaTablet' => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT',
214
- // http://www.intenso.de/kategorie_en.php?kategorie=33
215
- // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate
216
- 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab',
217
- // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/
218
- 'IRUTablet' => 'M702pro',
219
- 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b',
220
- // @ref: http://www.e-boda.ro/tablete-pc.html
221
- 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)',
222
- // @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
223
- 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)',
224
- // @reference: http://wiki.archosfans.com/index.php?title=Main_Page
225
- 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|ARCHOS 101G10',
226
- // @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
227
- 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark',
228
- // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER
229
- // @ref: Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser
230
- // @ref: http://www.sony.jp/support/tablet/
231
- 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201',
232
- // @ref: db + http://www.cube-tablet.com/buy-products.html
233
- 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT',
234
- // @ref: http://www.cobyusa.com/?p=pcat&pcat_id=3001
235
- 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010',
236
- // @ref: http://www.match.net.cn/products.asp
237
- 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733',
238
- // @ref: http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets)
239
- // @ref: http://www.imp3.net/14/show.php?itemid=20454
240
- 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)',
241
- // @ref: http://www.rock-chips.com/index.php?do=prod&pid=2
242
- 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A',
243
- // @ref: http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/
244
- 'FlyTablet' => 'IQ310|Fly Vision',
245
- // @ref: http://www.bqreaders.com/gb/tablets-prices-sale.html
246
- 'bqTablet' => 'bq.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant)|Maxwell.*Lite|Maxwell.*Plus',
247
- // @ref: http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290
248
- // @ref: http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets)
249
- 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim',
250
- // Nec or Medias Tab
251
- 'NecTablet' => '\bN-06D|\bN-08D',
252
- // Pantech Tablets: http://www.pantechusa.com/phones/
253
- 'PantechTablet' => 'Pantech.*P4100',
254
- // Broncho Tablets: http://www.broncho.cn/ (hard to find)
255
- 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)',
256
- // @ref: http://versusuk.com/support.html
257
- 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b',
258
- // @ref: http://www.zync.in/index.php/our-products/tablet-phablets
259
- 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900',
260
- // @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
261
- 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA',
262
- // @ref: https://www.nabitablet.com/
263
- 'NabiTablet' => 'Android.*\bNabi',
264
- 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build',
265
- // French Danew Tablets http://www.danew.com/produits-tablette.php
266
- 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b',
267
- // Texet Tablets and Readers http://www.texet.ru/tablet/
268
- 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE',
269
- // @note: Avoid detecting 'PLAYSTATION 3' as mobile.
270
- 'PlaystationTablet' => 'Playstation.*(Portable|Vita)',
271
- // @ref: http://www.trekstor.de/surftabs.html
272
- 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2',
273
- // @ref: http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets
274
- 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b',
275
- // @ref: http://www.advandigital.com/index.php?link=content-product&jns=JP001
276
- 'AdvanTablet' => 'Android.* \b(S5G|S5K|T5B|T3E|T3C|T3B|T1J|T1F|S5D|T2A|T1H|E1C|T1i|S5E|T1-E|S5F|E1-B|T2Ci|T1-B|T1-D|T5-A|O1-A|E1-A|T1-A|T3A|S5|T4i)\b ',
277
- // @ref: http://www.danytech.com/category/tablet-pc
278
- 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1',
279
- // @ref: http://www.galapad.net/product.html
280
- 'GalapadTablet' => 'Android.*\bG1\b',
281
- // @ref: http://www.micromaxinfo.com/tablet/funbook
282
- 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b',
283
- // http://www.karbonnmobiles.com/products_tablet.php
284
- 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b',
285
- // @ref: http://www.myallfine.com/Products.asp
286
- 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide',
287
- // @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
288
- 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b',
289
- // @ref: http://www.yonesnav.com/products/products.php
290
- 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026',
291
- // @ref: http://www.cjshowroom.com/eproducts.aspx?classcode=004001001
292
- // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html)
293
- 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503',
294
- // @ref: http://www.gloryunion.cn/products.asp
295
- // @ref: http://www.allwinnertech.com/en/apply/mobile.html
296
- // @ref: http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB)
297
- // @todo: Softwiner tablets?
298
- // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions.
299
- 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G
300
- // @ref: http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118
301
- 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10',
302
- // @ref: http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/
303
- // @todo: add more tests.
304
- 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)',
305
- // @ref: http://hclmetablet.com/India/index.php
306
- 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync',
307
- // @ref: http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html
308
- 'DPSTablet' => 'DPS Dream 9|DPS Dual 7',
309
- // @ref: http://www.visture.com/index.asp
310
- 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10',
311
- // @ref: http://www.mijncresta.nl/tablet
312
- 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989',
313
- // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309
314
- 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b',
315
- // Concorde tab
316
- 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan',
317
- // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/
318
- 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042',
319
- // Modecom Tablets - http://www.modecom.eu/tablets/portal/
320
- 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003',
321
- // Vonino Tablets - http://www.vonino.eu/tablets
322
- 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b',
323
- // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0
324
- 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1',
325
- // Storex Tablets - http://storex.fr/espace_client/support.html
326
- // @note: no need to add all the tablet codes since they are guided by the first regex.
327
- 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab',
328
- // Generic Vodafone tablets.
329
- 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10',
330
- // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb
331
- // Aka: http://www.essentielb.fr/
332
- 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2',
333
- // Ross & Moor - http://ross-moor.ru/
334
- 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711',
335
- // i-mobile http://product.i-mobilephone.com/Mobile_Device
336
- 'iMobileTablet' => 'i-mobile i-note',
337
- // @ref: http://www.tolino.de/de/vergleichen/
338
- 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine',
339
- // @ref: http://www.tesco.com/direct/hudl/
340
- 'Hudl' => 'Hudl HT7S3',
341
- // @ref: http://www.telstra.com.au/home-phone/thub-2/
342
- 'TelstraTablet' => 'T-Hub2',
343
- 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|ViewPad7|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab',
344
- );
345
-
346
- /**
347
- * List of mobile Operating Systems.
348
- *
349
- * @var array
350
- */
351
- protected static $operatingSystems = array(
352
- 'AndroidOS' => 'Android',
353
- 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os',
354
- 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino',
355
- 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b',
356
- // @reference: http://en.wikipedia.org/wiki/Windows_Mobile
357
- 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;',
358
- // @reference: http://en.wikipedia.org/wiki/Windows_Phone
359
- // http://wifeng.cn/?r=blog&a=view&id=106
360
- // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx
361
- 'WindowsPhoneOS' => 'Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7',
362
- 'iOS' => '\biPhone.*Mobile|\biPod|\biPad',
363
- // http://en.wikipedia.org/wiki/MeeGo
364
- // @todo: research MeeGo in UAs
365
- 'MeeGoOS' => 'MeeGo',
366
- // http://en.wikipedia.org/wiki/Maemo
367
- // @todo: research Maemo in UAs
368
- 'MaemoOS' => 'Maemo',
369
- 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135
370
- 'webOS' => 'webOS|hpwOS',
371
- 'badaOS' => '\bBada\b',
372
- 'BREWOS' => 'BREW',
373
- );
374
-
375
- /**
376
- * List of mobile User Agents.
377
- *
378
- * @var array
379
- */
380
- protected static $browsers = array(
381
- // @reference: https://developers.google.com/chrome/mobile/docs/user-agent
382
- 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?',
383
- 'Dolfin' => '\bDolfin\b',
384
- 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+',
385
- 'Skyfire' => 'Skyfire',
386
- 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+
387
- 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile',
388
- 'Bolt' => 'bolt',
389
- 'TeaShark' => 'teashark',
390
- 'Blazer' => 'Blazer',
391
- // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3
392
- 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile',
393
- // @ref: http://en.wikipedia.org/wiki/Midori_(web_browser)
394
- //'Midori' => 'midori',
395
- 'Tizen' => 'Tizen',
396
- 'UCBrowser' => 'UC.*Browser|UCWEB',
397
- // @ref: https://github.com/serbanghita/Mobile-Detect/issues/7
398
- 'DiigoBrowser' => 'DiigoBrowser',
399
- // http://www.puffinbrowser.com/index.php
400
- 'Puffin' => 'Puffin',
401
- // @ref: http://mercury-browser.com/index.html
402
- 'Mercury' => '\bMercury\b',
403
- // @reference: http://en.wikipedia.org/wiki/Minimo
404
- // http://en.wikipedia.org/wiki/Vision_Mobile_Browser
405
- 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger'
406
- );
407
-
408
- /**
409
- * Utilities.
410
- *
411
- * @var array
412
- */
413
- protected static $utilities = array(
414
- // Experimental. When a mobile device wants to switch to 'Desktop Mode'.
415
- // @ref: http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/
416
- // @ref: https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011
417
- 'DesktopMode' => 'WPDesktop',
418
- 'TV' => 'SonyDTV|HbbTV', // experimental
419
- 'WebKit' => '(webkit)[ /]([\w.]+)',
420
- 'Bot' => 'Googlebot|DoCoMo|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|facebookexternalhit',
421
- 'MobileBot' => 'Googlebot-Mobile|DoCoMo|YahooSeeker/M1A1-R2D2',
422
- 'Console' => '\b(Nintendo|Nintendo WiiU|PLAYSTATION|Xbox)\b',
423
- 'Watch' => 'SM-V700',
424
- );
425
-
426
- /**
427
- * All possible HTTP headers that represent the
428
- * User-Agent string.
429
- *
430
- * @var array
431
- */
432
- protected static $uaHttpHeaders = array(
433
- // The default User-Agent string.
434
- 'HTTP_USER_AGENT',
435
- // Header can occur on devices using Opera Mini.
436
- 'HTTP_X_OPERAMINI_PHONE_UA',
437
- // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/
438
- 'HTTP_X_DEVICE_USER_AGENT',
439
- 'HTTP_X_ORIGINAL_USER_AGENT',
440
- 'HTTP_X_SKYFIRE_PHONE',
441
- 'HTTP_X_BOLT_PHONE_UA',
442
- 'HTTP_DEVICE_STOCK_UA',
443
- 'HTTP_X_UCBROWSER_DEVICE_UA'
444
- );
445
-
446
- /**
447
- * The individual segments that could exist in a User-Agent string. VER refers to the regular
448
- * expression defined in the constant self::VER.
449
- *
450
- * @var array
451
- */
452
- protected static $properties = array(
453
-
454
- // Build
455
- 'Mobile' => 'Mobile/[VER]',
456
- 'Build' => 'Build/[VER]',
457
- 'Version' => 'Version/[VER]',
458
- 'VendorID' => 'VendorID/[VER]',
459
-
460
- // Devices
461
- 'iPad' => 'iPad.*CPU[a-z ]+[VER]',
462
- 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]',
463
- 'iPod' => 'iPod.*CPU[a-z ]+[VER]',
464
- //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'),
465
- 'Kindle' => 'Kindle/[VER]',
466
-
467
- // Browser
468
- 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'),
469
- 'Coast' => array('Coast/[VER]'),
470
- 'Dolfin' => 'Dolfin/[VER]',
471
- // @reference: https://developer.mozilla.org/en-US/docs/User_Agent_Strings_Reference
472
- 'Firefox' => 'Firefox/[VER]',
473
- 'Fennec' => 'Fennec/[VER]',
474
- // @reference: http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx
475
- 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];'),
476
- // http://en.wikipedia.org/wiki/NetFront
477
- 'NetFront' => 'NetFront/[VER]',
478
- 'NokiaBrowser' => 'NokiaBrowser/[VER]',
479
- 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ),
480
- 'Opera Mini' => 'Opera Mini/[VER]',
481
- 'Opera Mobi' => 'Version/[VER]',
482
- 'UC Browser' => 'UC Browser[VER]',
483
- 'MQQBrowser' => 'MQQBrowser/[VER]',
484
- 'MicroMessenger' => 'MicroMessenger/[VER]',
485
- // @note: Safari 7534.48.3 is actually Version 5.1.
486
- // @note: On BlackBerry the Version is overwriten by the OS.
487
- 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ),
488
- 'Skyfire' => 'Skyfire/[VER]',
489
- 'Tizen' => 'Tizen/[VER]',
490
- 'Webkit' => 'webkit[ /][VER]',
491
-
492
- // Engine
493
- 'Gecko' => 'Gecko/[VER]',
494
- 'Trident' => 'Trident/[VER]',
495
- 'Presto' => 'Presto/[VER]',
496
-
497
- // OS
498
- 'iOS' => ' \bOS\b [VER] ',
499
- 'Android' => 'Android [VER]',
500
- 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'),
501
- 'BREW' => 'BREW [VER]',
502
- 'Java' => 'Java/[VER]',
503
- // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx
504
- // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases
505
- 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'),
506
- 'Windows Phone' => 'Windows Phone [VER]',
507
- 'Windows CE' => 'Windows CE/[VER]',
508
- // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd
509
- 'Windows NT' => 'Windows NT [VER]',
510
- 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'),
511
- 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'),
512
- );
513
-
514
- /**
515
- * Construct an instance of this class.
516
- *
517
- * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored.
518
- * If left empty, will use the global _SERVER['HTTP_*'] vars instead.
519
- * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT
520
- * from the $headers array instead.
521
- */
522
- public function __construct(
523
- array $headers = null,
524
- $userAgent = null
525
- ){
526
- $this->setHttpHeaders($headers);
527
- $this->setUserAgent($userAgent);
528
- }
529
-
530
- /**
531
- * Get the current script version.
532
- * This is useful for the demo.php file,
533
- * so people can check on what version they are testing
534
- * for mobile devices.
535
- *
536
- * @return string The version number in semantic version format.
537
- */
538
- public static function getScriptVersion()
539
- {
540
- return self::VERSION;
541
- }
542
-
543
- /**
544
- * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers.
545
- *
546
- * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract
547
- * the headers. The default null is left for backwards compatibilty.
548
- */
549
- public function setHttpHeaders($httpHeaders = null)
550
- {
551
- //use global _SERVER if $httpHeaders aren't defined
552
- if (!is_array($httpHeaders) || !count($httpHeaders)) {
553
- $httpHeaders = $_SERVER;
554
- }
555
-
556
- //clear existing headers
557
- $this->httpHeaders = array();
558
-
559
- //Only save HTTP headers. In PHP land, that means only _SERVER vars that
560
- //start with HTTP_.
561
- foreach ($httpHeaders as $key => $value) {
562
- if (substr($key,0,5) == 'HTTP_') {
563
- $this->httpHeaders[$key] = $value;
564
- }
565
- }
566
- }
567
-
568
- /**
569
- * Retrieves the HTTP headers.
570
- *
571
- * @return array
572
- */
573
- public function getHttpHeaders()
574
- {
575
- return $this->httpHeaders;
576
- }
577
-
578
- /**
579
- * Retrieves a particular header. If it doesn't exist, no exception/error is caused.
580
- * Simply null is returned.
581
- *
582
- * @param string $header The name of the header to retrieve. Can be HTTP compliant such as
583
- * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the
584
- * all-caps, HTTP_ prefixed, underscore seperated awesomeness.
585
- *
586
- * @return string|null The value of the header.
587
- */
588
- public function getHttpHeader($header)
589
- {
590
- //are we using PHP-flavored headers?
591
- if (strpos($header, '_') === false) {
592
- $header = str_replace('-', '_', $header);
593
- $header = strtoupper($header);
594
- }
595
-
596
- //test the alternate, too
597
- $altHeader = 'HTTP_' . $header;
598
-
599
- //Test both the regular and the HTTP_ prefix
600
- if (isset($this->httpHeaders[$header])) {
601
- return $this->httpHeaders[$header];
602
- } elseif (isset($this->httpHeaders[$altHeader])) {
603
- return $this->httpHeaders[$altHeader];
604
- }
605
- }
606
-
607
- public function getMobileHeaders()
608
- {
609
- return self::$mobileHeaders;
610
- }
611
-
612
- /**
613
- * Get all possible HTTP headers that
614
- * can contain the User-Agent string.
615
- *
616
- * @return array List of HTTP headers.
617
- */
618
- public function getUaHttpHeaders()
619
- {
620
- return self::$uaHttpHeaders;
621
- }
622
-
623
- /**
624
- * Set the User-Agent to be used.
625
- *
626
- * @param string $userAgent The user agent string to set.
627
- */
628
- public function setUserAgent($userAgent = null)
629
- {
630
- if (!empty($userAgent)) {
631
- return $this->userAgent = $userAgent;
632
- } else {
633
-
634
- $this->userAgent = null;
635
-
636
- foreach($this->getUaHttpHeaders() as $altHeader){
637
- if(!empty($this->httpHeaders[$altHeader])){ // @todo: should use getHttpHeader(), but it would be slow. (Serban)
638
- $this->userAgent .= $this->httpHeaders[$altHeader] . " ";
639
- }
640
- }
641
-
642
- return $this->userAgent = (!empty($this->userAgent) ? trim($this->userAgent) : null);
643
-
644
- }
645
- }
646
-
647
- /**
648
- * Retrieve the User-Agent.
649
- *
650
- * @return string|null The user agent if it's set.
651
- */
652
- public function getUserAgent()
653
- {
654
- return $this->userAgent;
655
- }
656
-
657
- /**
658
- * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or
659
- * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set.
660
- *
661
- * @deprecated since version 2.6.9
662
- *
663
- * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default
664
- * parameter is null which will default to self::DETECTION_TYPE_MOBILE.
665
- */
666
- public function setDetectionType($type = null)
667
- {
668
- if ($type === null) {
669
- $type = self::DETECTION_TYPE_MOBILE;
670
- }
671
-
672
- if ($type != self::DETECTION_TYPE_MOBILE && $type != self::DETECTION_TYPE_EXTENDED) {
673
- return;
674
- }
675
-
676
- $this->detectionType = $type;
677
- }
678
-
679
- /**
680
- * Retrieve the list of known phone devices.
681
- *
682
- * @return array List of phone devices.
683
- */
684
- public static function getPhoneDevices()
685
- {
686
- return self::$phoneDevices;
687
- }
688
-
689
- /**
690
- * Retrieve the list of known tablet devices.
691
- *
692
- * @return array List of tablet devices.
693
- */
694
- public static function getTabletDevices()
695
- {
696
- return self::$tabletDevices;
697
- }
698
-
699
- /**
700
- * Alias for getBrowsers() method.
701
- *
702
- * @return array List of user agents.
703
- */
704
- public static function getUserAgents()
705
- {
706
- return self::getBrowsers();
707
- }
708
-
709
- /**
710
- * Retrieve the list of known browsers. Specifically, the user agents.
711
- *
712
- * @return array List of browsers / user agents.
713
- */
714
- public static function getBrowsers()
715
- {
716
- return self::$browsers;
717
- }
718
-
719
- /**
720
- * Retrieve the list of known utilities.
721
- *
722
- * @return array List of utilities.
723
- */
724
- public static function getUtilities()
725
- {
726
- return self::$utilities;
727
- }
728
-
729
- /**
730
- * Method gets the mobile detection rules. This method is used for the magic methods $detect->is*().
731
- *
732
- * @deprecated since version 2.6.9
733
- *
734
- * @return array All the rules (but not extended).
735
- */
736
- public static function getMobileDetectionRules()
737
- {
738
- static $rules;
739
-
740
- if (!$rules) {
741
- $rules = array_merge(
742
- self::$phoneDevices,
743
- self::$tabletDevices,
744
- self::$operatingSystems,
745
- self::$browsers
746
- );
747
- }
748
-
749
- return $rules;
750
-
751
- }
752
-
753
- /**
754
- * Method gets the mobile detection rules + utilities.
755
- * The reason this is separate is because utilities rules
756
- * don't necessary imply mobile. This method is used inside
757
- * the new $detect->is('stuff') method.
758
- *
759
- * @deprecated since version 2.6.9
760
- *
761
- * @return array All the rules + extended.
762
- */
763
- public function getMobileDetectionRulesExtended()
764
- {
765
- static $rules;
766
-
767
- if (!$rules) {
768
- // Merge all rules together.
769
- $rules = array_merge(
770
- self::$phoneDevices,
771
- self::$tabletDevices,
772
- self::$operatingSystems,
773
- self::$browsers,
774
- self::$utilities
775
- );
776
- }
777
-
778
- return $rules;
779
- }
780
-
781
- /**
782
- * Retrieve the current set of rules.
783
- *
784
- * @deprecated since version 2.6.9
785
- *
786
- * @return array
787
- */
788
- public function getRules()
789
- {
790
- if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) {
791
- return self::getMobileDetectionRulesExtended();
792
- } else {
793
- return self::getMobileDetectionRules();
794
- }
795
- }
796
-
797
- /**
798
- * Retrieve the list of mobile operating systems.
799
- *
800
- * @return array The list of mobile operating systems.
801
- */
802
- public static function getOperatingSystems()
803
- {
804
- return self::$operatingSystems;
805
- }
806
-
807
- /**
808
- * Check the HTTP headers for signs of mobile.
809
- * This is the fastest mobile check possible; it's used
810
- * inside isMobile() method.
811
- *
812
- * @return bool
813
- */
814
- public function checkHttpHeadersForMobile()
815
- {
816
-
817
- foreach($this->getMobileHeaders() as $mobileHeader => $matchType){
818
- if( isset($this->httpHeaders[$mobileHeader]) ){
819
- if( is_array($matchType['matches']) ){
820
- foreach($matchType['matches'] as $_match){
821
- if( strpos($this->httpHeaders[$mobileHeader], $_match) !== false ){
822
- return true;
823
- }
824
- }
825
- return false;
826
- } else {
827
- return true;
828
- }
829
- }
830
- }
831
-
832
- return false;
833
-
834
- }
835
-
836
- /**
837
- * Magic overloading method.
838
- *
839
- * @method boolean is[...]()
840
- * @param string $name
841
- * @param array $arguments
842
- * @return mixed
843
- * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is'
844
- */
845
- public function __call($name, $arguments)
846
- {
847
- //make sure the name starts with 'is', otherwise
848
- if (substr($name, 0, 2) != 'is') {
849
- throw new BadMethodCallException("No such method exists: $name");
850
- }
851
-
852
- $this->setDetectionType(self::DETECTION_TYPE_MOBILE);
853
-
854
- $key = substr($name, 2);
855
-
856
- return $this->matchUAAgainstKey($key);
857
- }
858
-
859
- /**
860
- * Find a detection rule that matches the current User-agent.
861
- *
862
- * @param null $userAgent deprecated
863
- * @return boolean
864
- */
865
- protected function matchDetectionRulesAgainstUA($userAgent = null)
866
- {
867
- // Begin general search.
868
- foreach ($this->getRules() as $_regex) {
869
- if (empty($_regex)) {
870
- continue;
871
- }
872
- if ($this->match($_regex, $userAgent)) {
873
- return true;
874
- }
875
- }
876
-
877
- return false;
878
- }
879
-
880
- /**
881
- * Search for a certain key in the rules array.
882
- * If the key is found the try to match the corresponding
883
- * regex agains the User-Agent.
884
- *
885
- * @param string $key
886
- * @param null $userAgent deprecated
887
- * @return mixed
888
- */
889
- protected function matchUAAgainstKey($key, $userAgent = null)
890
- {
891
- // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc.
892
- $key = strtolower($key);
893
-
894
- //change the keys to lower case
895
- $_rules = array_change_key_case($this->getRules());
896
-
897
- if (array_key_exists($key, $_rules)) {
898
- if (empty($_rules[$key])) {
899
- return null;
900
- }
901
-
902
- return $this->match($_rules[$key], $userAgent);
903
- }
904
-
905
- return false;
906
- }
907
-
908
- /**
909
- * Check if the device is mobile.
910
- * Returns true if any type of mobile device detected, including special ones
911
- * @param null $userAgent deprecated
912
- * @param null $httpHeaders deprecated
913
- * @return bool
914
- */
915
- public function isMobile($userAgent = null, $httpHeaders = null)
916
- {
917
-
918
- if ($httpHeaders) {
919
- $this->setHttpHeaders($httpHeaders);
920
- }
921
-
922
- if ($userAgent) {
923
- $this->setUserAgent($userAgent);
924
- }
925
-
926
- $this->setDetectionType(self::DETECTION_TYPE_MOBILE);
927
-
928
- if ($this->checkHttpHeadersForMobile()) {
929
- return true;
930
- } else {
931
- return $this->matchDetectionRulesAgainstUA();
932
- }
933
-
934
- }
935
-
936
- /**
937
- * Check if the device is a tablet.
938
- * Return true if any type of tablet device is detected.
939
- *
940
- * @param string $userAgent deprecated
941
- * @param array $httpHeaders deprecated
942
- * @return bool
943
- */
944
- public function isTablet($userAgent = null, $httpHeaders = null)
945
- {
946
- $this->setDetectionType(self::DETECTION_TYPE_MOBILE);
947
-
948
- foreach (self::$tabletDevices as $_regex) {
949
- if ($this->match($_regex, $userAgent)) {
950
- return true;
951
- }
952
- }
953
-
954
- return false;
955
- }
956
-
957
- /**
958
- * This method checks for a certain property in the
959
- * userAgent.
960
- * @todo: The httpHeaders part is not yet used.
961
- *
962
- * @param $key
963
- * @param string $userAgent deprecated
964
- * @param string $httpHeaders deprecated
965
- * @return bool|int|null
966
- */
967
- public function is($key, $userAgent = null, $httpHeaders = null)
968
- {
969
- // Set the UA and HTTP headers only if needed (eg. batch mode).
970
- if ($httpHeaders) {
971
- $this->setHttpHeaders($httpHeaders);
972
- }
973
-
974
- if ($userAgent) {
975
- $this->setUserAgent($userAgent);
976
- }
977
-
978
- $this->setDetectionType(self::DETECTION_TYPE_EXTENDED);
979
-
980
- return $this->matchUAAgainstKey($key);
981
- }
982
-
983
- /**
984
- * Some detection rules are relative (not standard),
985
- * because of the diversity of devices, vendors and
986
- * their conventions in representing the User-Agent or
987
- * the HTTP headers.
988
- *
989
- * This method will be used to check custom regexes against
990
- * the User-Agent string.
991
- *
992
- * @param $regex
993
- * @param string $userAgent
994
- * @return bool
995
- *
996
- * @todo: search in the HTTP headers too.
997
- */
998
- public function match($regex, $userAgent = null)
999
- {
1000
- // Escape the special character which is the delimiter.
1001
- $regex = str_replace('/', '\/', $regex);
1002
-
1003
- return (bool) preg_match('/'.$regex.'/is', (!empty($userAgent) ? $userAgent : $this->userAgent));
1004
- }
1005
-
1006
- /**
1007
- * Get the properties array.
1008
- *
1009
- * @return array
1010
- */
1011
- public static function getProperties()
1012
- {
1013
- return self::$properties;
1014
- }
1015
-
1016
- /**
1017
- * Prepare the version number.
1018
- *
1019
- * @todo Remove the error supression from str_replace() call.
1020
- *
1021
- * @param string $ver The string version, like "2.6.21.2152";
1022
- *
1023
- * @return float
1024
- */
1025
- public function prepareVersionNo($ver)
1026
- {
1027
- $ver = str_replace(array('_', ' ', '/'), '.', $ver);
1028
- $arrVer = explode('.', $ver, 2);
1029
-
1030
- if (isset($arrVer[1])) {
1031
- $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions.
1032
- }
1033
-
1034
- return (float) implode('.', $arrVer);
1035
- }
1036
-
1037
- /**
1038
- * Check the version of the given property in the User-Agent.
1039
- * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31)
1040
- *
1041
- * @param string $propertyName The name of the property. See self::getProperties() array
1042
- * keys for all possible properties.
1043
- * @param string $type Either self::VERSION_TYPE_STRING to get a string value or
1044
- * self::VERSION_TYPE_FLOAT indicating a float value. This parameter
1045
- * is optional and defaults to self::VERSION_TYPE_STRING. Passing an
1046
- * invalid parameter will default to the this type as well.
1047
- *
1048
- * @return string|float The version of the property we are trying to extract.
1049
- */
1050
- public function version($propertyName, $type = self::VERSION_TYPE_STRING)
1051
- {
1052
- if (empty($propertyName)) {
1053
- return false;
1054
- }
1055
-
1056
- //set the $type to the default if we don't recognize the type
1057
- if ($type != self::VERSION_TYPE_STRING && $type != self::VERSION_TYPE_FLOAT) {
1058
- $type = self::VERSION_TYPE_STRING;
1059
- }
1060
-
1061
- $properties = self::getProperties();
1062
-
1063
- // Check if the property exists in the properties array.
1064
- if (array_key_exists($propertyName, $properties)) {
1065
-
1066
- // Prepare the pattern to be matched.
1067
- // Make sure we always deal with an array (string is converted).
1068
- $properties[$propertyName] = (array) $properties[$propertyName];
1069
-
1070
- foreach ($properties[$propertyName] as $propertyMatchString) {
1071
-
1072
- $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString);
1073
-
1074
- // Escape the special character which is the delimiter.
1075
- $propertyPattern = str_replace('/', '\/', $propertyPattern);
1076
-
1077
- // Identify and extract the version.
1078
- preg_match('/'.$propertyPattern.'/is', $this->userAgent, $match);
1079
-
1080
- if (!empty($match[1])) {
1081
- $version = ( $type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1] );
1082
-
1083
- return $version;
1084
- }
1085
-
1086
- }
1087
-
1088
- }
1089
-
1090
- return false;
1091
- }
1092
-
1093
- /**
1094
- * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants.
1095
- *
1096
- * @return string One of the self::MOBILE_GRADE_* constants.
1097
- */
1098
- public function mobileGrade()
1099
- {
1100
- $isMobile = $this->isMobile();
1101
-
1102
- if (
1103
- // Apple iOS 3.2-5.1 - Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3), iPad 3 (5.1), original iPhone (3.1), iPhone 3 (3.2), 3GS (4.3), 4 (4.3 / 5.0), and 4S (5.1)
1104
- $this->version('iPad', self::VERSION_TYPE_FLOAT)>=4.3 ||
1105
- $this->version('iPhone', self::VERSION_TYPE_FLOAT)>=3.1 ||
1106
- $this->version('iPod', self::VERSION_TYPE_FLOAT)>=3.1 ||
1107
-
1108
- // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5)
1109
- // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM
1110
- // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices
1111
- // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7
1112
- ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) ||
1113
-
1114
- // Windows Phone 7-7.5 - Tested on the HTC Surround (7.0) HTC Trophy (7.5), LG-E900 (7.5), Nokia Lumia 800
1115
- $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT)>=7.0 ||
1116
-
1117
- // Blackberry 7 - Tested on BlackBerry® Torch 9810
1118
- // Blackberry 6.0 - Tested on the Torch 9800 and Style 9670
1119
- $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=6.0 ||
1120
- // Blackberry Playbook (1.0-2.0) - Tested on PlayBook
1121
- $this->match('Playbook.*Tablet') ||
1122
-
1123
- // Palm WebOS (1.4-2.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0)
1124
- ( $this->version('webOS', self::VERSION_TYPE_FLOAT)>=1.4 && $this->match('Palm|Pre|Pixi') ) ||
1125
- // Palm WebOS 3.0 - Tested on HP TouchPad
1126
- $this->match('hp.*TouchPad') ||
1127
-
1128
- // Firefox Mobile (12 Beta) - Tested on Android 2.3 device
1129
- ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=12 ) ||
1130
-
1131
- // Chrome for Android - Tested on Android 4.0, 4.1 device
1132
- ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=4.0 ) ||
1133
-
1134
- // Skyfire 4.1 - Tested on Android 2.3 device
1135
- ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT)>=4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) ||
1136
-
1137
- // Opera Mobile 11.5-12: Tested on Android 2.3
1138
- ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>11 && $this->is('AndroidOS') ) ||
1139
-
1140
- // Meego 1.2 - Tested on Nokia 950 and N9
1141
- $this->is('MeeGoOS') ||
1142
-
1143
- // Tizen (pre-release) - Tested on early hardware
1144
- $this->is('Tizen') ||
1145
-
1146
- // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser
1147
- // @todo: more tests here!
1148
- $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT)>=2.0 ||
1149
-
1150
- // UC Browser - Tested on Android 2.3 device
1151
- ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) ||
1152
-
1153
- // Kindle 3 and Fire - Tested on the built-in WebKit browser for each
1154
- ( $this->match('Kindle Fire') ||
1155
- $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT)>=3.0 ) ||
1156
-
1157
- // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet
1158
- $this->is('AndroidOS') && $this->is('NookTablet') ||
1159
-
1160
- // Chrome Desktop 11-21 - Tested on OS X 10.7 and Windows 7
1161
- $this->version('Chrome', self::VERSION_TYPE_FLOAT)>=11 && !$isMobile ||
1162
-
1163
- // Safari Desktop 4-5 - Tested on OS X 10.7 and Windows 7
1164
- $this->version('Safari', self::VERSION_TYPE_FLOAT)>=5.0 && !$isMobile ||
1165
-
1166
- // Firefox Desktop 4-13 - Tested on OS X 10.7 and Windows 7
1167
- $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=4.0 && !$isMobile ||
1168
-
1169
- // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7
1170
- $this->version('MSIE', self::VERSION_TYPE_FLOAT)>=7.0 && !$isMobile ||
1171
-
1172
- // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7
1173
- // @reference: http://my.opera.com/community/openweb/idopera/
1174
- $this->version('Opera', self::VERSION_TYPE_FLOAT)>=10 && !$isMobile
1175
-
1176
- ){
1177
- return self::MOBILE_GRADE_A;
1178
- }
1179
-
1180
- if (
1181
- $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 ||
1182
- $this->version('iPhone', self::VERSION_TYPE_FLOAT)<3.1 ||
1183
- $this->version('iPod', self::VERSION_TYPE_FLOAT)<3.1 ||
1184
-
1185
- // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770
1186
- $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 ||
1187
-
1188
- //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3
1189
- ( $this->version('Opera Mini', self::VERSION_TYPE_FLOAT)>=5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT)<=6.5 &&
1190
- ($this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 || $this->is('iOS')) ) ||
1191
-
1192
- // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1)
1193
- $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') ||
1194
-
1195
- // @todo: report this (tested on Nokia N71)
1196
- $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>=11 && $this->is('SymbianOS')
1197
- ){
1198
- return self::MOBILE_GRADE_B;
1199
- }
1200
-
1201
- if (
1202
- // Blackberry 4.x - Tested on the Curve 8330
1203
- $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<5.0 ||
1204
- // Windows Mobile - Tested on the HTC Leo (WinMo 5.2)
1205
- $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT)<=5.2
1206
-
1207
- ){
1208
- return self::MOBILE_GRADE_C;
1209
- }
1210
-
1211
- //All older smartphone platforms and featurephones - Any device that doesn't support media queries
1212
- //will receive the basic, C grade experience.
1213
- return self::MOBILE_GRADE_C;
1214
- }
1215
- }