nadar / parser
PHP (PHP 8 兼容分支) 的用户代理嗅探库
Requires
- php: >=8.1
- psr/cache: ^1.0 || ^2.0 || ^3.0
Requires (Dev)
- cache/array-adapter: ^1.1
- icomefromthenet/reverse-regex: 0.0.6.3
- php-coveralls/php-coveralls: ^2.0
- phpunit/php-code-coverage: ^5.0 || ^7.0
- phpunit/phpunit: ^6.0 || ^8.0
- squizlabs/php_codesniffer: ^3.5
- symfony/yaml: ~3.4 || ~4.0
Suggests
- cache/array-adapter: Allows testing of the caching functionality
This package is auto-updated.
Last update: 2024-08-30 01:07:07 UTC
README
这个分支需要,因为该项目似乎已被放弃,但需要一些 PHP 8.2 的修复。见 => WhichBrowser#673 我们已经保持了相同的命名空间,所以你只需要在 composer.json 中将 whichbrowser/parser 替换为 nadar/parser
这是一个极其复杂且几乎完全无用的浏览器嗅探库。无用是因为你不应该使用浏览器嗅探。所以现在就停下来,去读一些关于功能检测的东西。我是认真的。走开。你以后会感谢我的。
关于 WhichBrowser
但为什么几乎完全无用而不是完全无用? 好吧,总有例外。进行浏览器嗅探有合理的理由:改善用户体验或收集有关网站上使用的浏览器的情报。我的网站是 html5test.com,我想知道哪个分数属于哪个浏览器。为此,你需要一个浏览器嗅探库。
为什么它如此复杂?
因为每个人都在撒谎。说真的,没有哪个浏览器是完全诚实的。几乎所有浏览器都说自己是 Netscape 5,几乎所有 WebKit 浏览器都说自己是基于 Gecko。甚至 Internet Explorer 11 现在也不再声称是 IE,而是一个类似 Gecko 的未命名的浏览器。更糟糕的是,这就是为什么它很复杂。
它提供什么样的信息? 你会得到一个包含有关浏览器、渲染引擎、操作系统和设备的信息的漂亮对象。它提供了名称和版本,甚至设备制造商和型号。WhichBrowser 非常坚持不懈。它提供的信息是其他人没有的。例如
JUC (Linux; U; 2.3.6; zh-cn; GT-I8150; 480*800) UCWEB8.7.4.225/145/800
UC Browser 8.7 on a Samsung Galaxy W running Android 2.3.6
Android 从未提到
Mozilla/5.0 (Series40; Nokia501/10.0.2; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.0.0.0.73
Nokia Xpress 3.0.0 on a Nokia Asha 501 running Nokia Asha Platform
尽管用户代理标头声称是一个 Series40 设备,但我们知道它实际上正在运行 Asha 平台,我们还知道 OviBrowser 已更名为 Nokia Xpress。
Opera/9.80 (X11; Linux zvav; U; zh) Presto/2.8.119 Version/11.10
Opera Mini on a Nokia 5230 running Series60 5.0
用户代理标头看起来像是 Linux 上的 Opera 11.10,但我们知道它是 Opera Mini。我们甚至可以从小头信息中找出真正的操作系统和设备型号。
要求
WhichBrowser 需要 PHP 7.0 或更高版本,并支持 PHP 8。WhichBrowser 与 PSR-4 自动加载标准兼容,并遵循 PSR-1 和 PSR-2 编码风格。
如何安装
您可以使用 Composer(PHP 的标准包管理器)安装 WhichBrowser。该软件包的名称为 whichbrowser/parser
。
composer require nadar/parser
您可以通过运行简单的命令轻松更新 WhichBrowser。
composer update nadar/parser
您应该尽可能经常运行此命令。您甚至可以考虑为此设置 cron 作业。
如何使用
第一步需要 Composer 自动加载器
<?php require 'vendor/autoload.php';
第二步是创建一个新的 WhichBrowser\Parser
对象。该对象将包含库所能找到的所有浏览器信息。该对象有一个必需的参数,即浏览器发送的标头或用户代理字符串。使用标头更佳,因为它将允许更好的检测,但如果您只有用户代理字符串,这也将有效。
例如
$result = new WhichBrowser\Parser(getallheaders());
或
$result = new WhichBrowser\Parser($_SERVER['HTTP_USER_AGENT']);
变量 $result
现在包含一个对象,您可以通过它查询信息。有各种方式访问信息。
首先,您可以调用 toString()
函数以获取可读性强的标识
"You are using " . $result->toString(); // You are using Chrome 27 on OS X Mountain Lion 10.8
另一种可能性是查询对象
$result->isType('desktop'); // true $result->isType('mobile', 'tablet', 'media', 'gaming:portable'); // false $result->isBrowser('Maxthon', '<', '4.0.5'); // false $result->isOs('iOS', '>=', '8'); // false $result->isOs('OS X'); // true $result->isEngine('Blink'); // true
您也可以直接访问这些属性
$result->browser->toString(); // Chrome 27 $result->engine->toString(); // Blink $result->os->toString(); // OS X Mountain Lion 10.8
或者直接访问这些属性的某些部分
$result->browser->name; // Chrome $result->browser->name . ' ' . $result->browser->version.toString(); // Chrome 27 $result->browser->version->value; // 27.0.1453.110 $result->engine->name; // Blink
最后,您还可以直接查询版本
$result->browser->version->is('>', 26); // true $result->os->version->is('<', '10.7.4'); // false
选项
在创建Parser
对象时,可以通过传递数组作为第二个参数来设置额外的选项。
禁用机器人检测
在某些情况下,您可能想要禁用机器人检测。这允许机器人故意欺骗WhichBrowser,这样您就可以获取机器人试图模拟的用户代理的身份。当您想使用WhichBrowser在网站的不同版本之间切换,并确保爬虫看到正确的网站版本时,这尤其有用。例如,模仿移动设备的机器人将看到您的网站的移动版本。
$result = new WhichBrowser\Parser(getallheaders(), [ 'detectBots' => false ]);
启用结果缓存
WhichBrowser支持PSR-6兼容的缓存适配器,用于在请求之间缓存结果。使用缓存特别有用,如果您在网站的每一页上使用WhichBrowser,并且用户访问了多个页面。在首次访问时,将解析标头并将结果缓存。在后续访问中,将使用缓存的結果,这比反复解析标头要快得多。
还有其他类型的缓存适配器可用,例如APC、Doctrine、Memcached、MongoDB、Redis等。这些适配器的配置各不相同,但一旦配置完成,您只需在创建Parser
对象时将其作为选项传递,或者使用setCache()
函数之后设置它。WhichBrowser已测试可与PHP Cache提供的适配器一起工作。有关提供适配器的其他包的列表,请参阅Packagist。
例如,如果您想启用基于memcached的缓存,您需要安装额外的composer包
composer require cache/memcached-adapter
并将对WhichBrowser/Parser的调用更改为以下内容
$client = new \Memcached(); $client->addServer('localhost', 11211); $pool = new \Cache\Adapter\Memcached\MemcachedCachePool($client); $result = new WhichBrowser\Parser(getallheaders(), [ 'cache' => $pool ]);
或
$client = new \Memcached(); $client->addServer('localhost', 11211); $pool = new \Cache\Adapter\Memcached\MemcachedCachePool($client); $result = new WhichBrowser\Parser(); $result->setCache($pool); $result->analyse(getallheaders());
您还可以指定缓存结果应在多少秒后丢弃。默认值是900秒或15分钟。如果您认为WhichBrowser使用太多内存进行缓存,应降低此值。您可以通过设置cacheExpires
选项或将它作为setCache()
函数的第二个参数来这样做。
API参考
解析器对象
创建一个新的WhichBrowser\Parser
对象后,它包含多个属性和函数。所有这些属性都是保证存在的。
属性
browser
包含关于浏览器本身的信息的对象engine
包含关于渲染引擎的信息的对象os
包含关于操作系统的信息的对象device
包含关于设备的信息的对象
函数
getType()
返回device
对象的type
和subtype
属性。如果存在子类型,则将其连接到类型并使用分号分隔,例如:mobile:smart
或gaming:portable
。如果子类型不适用,则只返回类型,例如:desktop
或ereader
。
isType($type [,$type [,$type [,$type]]])
如果使用单个参数,该函数返回如果参数匹配device
对象的type
属性,则为true
。参数可以可选地通过将子类型连接到类型并使用分号分隔来提供子类型。它可以使用多个参数,在这种情况下,如果其中一个参数匹配,则函数返回true
。如果没有参数匹配,则返回false
。
isMobile()
如果浏览器是手机、平板电脑、电子阅读器、相机、便携式媒体播放器、手表或便携式游戏机等移动设备,则返回true
。否则返回false
。
isBrowser($name [, $comparison, $version])
用于查询浏览器对象的name
和version
属性。该函数可以包含一个基于name
的单个参数进行简单比较,或者包含三个参数来比较name
和version
。第一个参数总是包含浏览器的名称。第二个参数是一个字符串,可以是<
、<=
、=
、=>
或>
之一。第三个是一个整数、浮点数或字符串,包含版本信息。您可以使用类似于10
、10.7
或'10.7.4'
的版本。有关版本比较如何执行的更多信息,请参阅Version
对象的is()
函数。
isEngine($name [, $comparison, $version])
用于查询engine
对象的name
和version
属性。此函数与isBrowser
完全相同。
isOs($name [, $comparison, $version])
用于查询os
对象的name
和version
属性。此函数与isBrowser
完全相同。
isDetected()
实际上检测到了某些浏览器,还是我们没有检测到任何东西?
toString()
获取检测到的浏览器的人读表示形式,包括操作系统和设备信息。
浏览器对象
WhichBrowser\Model\Browser
类的对象用于主WhichBrowser\Parser
对象的browser
属性,并包含多个属性。如果某个属性在此情况下不适用,则将为null或undefined。
属性
name
包含浏览器名称的字符串alias
包含浏览器替代名称的字符串version
包含有关浏览器版本信息的版本对象stock
布尔值,如果浏览器是操作系统的默认浏览器则为true,否则为falsechannel
包含分发渠道的字符串,例如'Nightly'或'Next'。mode
可以包含浏览器操作模式的字符串,例如'proxy'。hidden
布尔值,如果浏览器没有名称且是操作系统的默认浏览器,则为truefamily
包含有关此浏览器所属家族信息的对象using
包含有关浏览器使用哪种类型webview信息的对象
函数
isFamily($name)
此浏览器的家族是否有此名称,或者浏览器本身是否有此名称。
isUsing($name)
浏览器是否正在使用具有提供名称的webview。
getName()
获取浏览器的名称
getVersion()
获取浏览器的版本
toString()
获取检测到的浏览器的人读表示形式
引擎对象
WhichBrowser\Model\Engine
类的对象用于主WhichBrowser\Parser
对象的engine
属性,并包含多个属性。如果某个属性在此情况下不适用,则将为null或undefined。
属性
name
包含渲染引擎名称的字符串version
包含有关渲染引擎版本信息的版本对象
函数
getName()
获取渲染引擎的名称
getVersion()
获取渲染引擎的版本
toString()
获取检测到的渲染引擎的人读表示形式
操作系统对象
WhichBrowser\Model\Os
类的对象用于主WhichBrowser\Parser
对象的os
属性,并包含多个属性。如果某个属性在此情况下不适用,则将为null或undefined。
属性
name
包含操作系统名称的字符串version
包含有关操作系统版本信息的版本对象family
包含有关此操作系统所属家族信息的对象
函数
isFamily($name)
这个操作系统的家族是否具有这个名称,还是这个操作系统的名称就是这样的。
getName()
获取操作系统的名称
getVersion()
获取操作系统的版本
toString()
获取检测到的操作系统的可读表示
设备对象
使用WhichBrowser\Model\Device
类的对象作为主WhichBrowser\Parser
对象的device
属性,并包含许多属性。如果属性在此情况下不适用,它将为null或undefined。
属性
类型
包含浏览器类型的字符串。子类型
包含浏览器子类型的字符串。已识别
一个布尔值,如果设备已被正面识别则为true。制造商
包含设备制造商的字符串,例如 'Apple' 或 'Samsung'。型号
包含设备型号的字符串,例如 'iPhone' 或 'Galaxy S4'。
type
属性可以包含以下列表中的任何值
- 桌面
- 移动
- PDA
- DECT
- 平板电脑
- 游戏
- 电子阅读器
- 媒体
- 耳机
- 手表
- 模拟器
- 电视
- 显示器
- 摄像头
- 打印机
- 标识
- 白板
- 开发板
- 在飞行中
- 家电
- GPS
- 汽车
- 销售点
- 机器人
- 投影仪
如果type
为"移动",则subtype
属性可以包含以下列表中的任何值
- 功能
- 智能
如果type
为"游戏",则subtype
属性可以包含以下列表中的任何值
- 控制台
- 便携式
函数
getManufacturer()
获取制造商的名称
getModel()
获取型号的名称
toString()
获取检测到的设备的可读表示
家族对象
使用WhichBrowser\Model\Family
类的对象作为WhichBrowser\Model\Browser
和WhichBrowser\Model\Os
对象的family
属性,并包含许多属性。如果属性在此情况下不适用,它将为null或undefined。
属性
name
包含家族名称的字符串version
包含有关家族版本信息的版本对象
函数
getName()
获取家族的名称
getVersion()
获取家族的版本
toString()
获取家族的可读表示
使用对象
使用WhichBrowser\Model\Using
类的对象作为WhichBrowser\Model\Browser
对象的using
属性,并包含许多属性。如果属性在此情况下不适用,它将为null或undefined。
属性
name
包含webview名称的字符串version
包含有关webview版本信息的版本对象
函数
getName()
获取webview的名称
getVersion()
获取webview的版本
toString()
获取webview的可读表示
版本对象
使用WhichBrowser\Model\Version
类的对象作为browser
、engine
和os
对象的version
属性,并包含许多属性和函数。如果属性在此情况下不适用,它将为null或undefined。
属性
值
包含原始版本号的字符串。alias
包含版本号的别名,例如 Windows 的 '5.1' 为 'XP'。昵称
包含版本号的昵称,例如 OS X 的 '10.14' 为 'Mojave'。详细信息
包含应打印的版本号数字的整数。
函数
is($version)
或is($comparison, $version)
使用这个函数可以轻松比较两个版本。如果你只指定一个参数,这个函数将返回版本是否相同。你也可以指定两个参数,在这种情况下,第一个参数包含比较运算符,例如 <
、<=
、=
、=>
或 >
。第二个参数是你想要比较的版本。你可以使用版本号如 10
、10.7
或 '10.7.4'
,但请注意,10
与 10.0
是不同的。例如,如果我们的操作系统版本是 10.7.4
$result->os->version->is('10.7.4'); // true $result->os->version->is('10.7'); // true $result->os->version->is('10'); // true $result->os->version->is('10.0'); // false $result->os->version->is('>', '10'); // false $result->os->version->is('>', '10.7'); // false $result->os->version->is('>', '10.7.3'); // true