我的Useragent,在Opera浏览器中测试时,读取:
Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.125 Safari/537.36 OPR/30.0.1835.88
现在,我有下面的脚本来测试浏览器:
$browser_list = array(
array('search_string' => 'chrome', 'bname' => 'Google Chrome', 'matchname' => 'chrome', 'ub' => 'Chrome'),
array('search_string' => 'firefox', 'bname' => 'Mozilla Firefox', 'matchname' => 'firefox', 'ub' => 'Firefox'),
array('search_string' => 'safari', 'bname' => 'Apple Safari', 'matchname' => 'Safari', 'ub' => 'Safari'),
array('search_string' => 'netscape', 'bname' => 'Netscape', 'matchname' => 'Netscape', 'ub' => 'Netscape'),
array('search_string' => 'opera', 'bname' => 'Opera', 'matchname' => 'Opera', 'ub' => 'Opera'), // Must be before IE
array('search_string' => 'MSIE', 'bname' => 'Internet Explorer', 'matchname' => 'IE', 'ub' => 'MSIE'),
array('search_string' => 'Mozilla', 'bname' => 'Internet Explorer', 'matchname' => 'IE', 'ub' => 'MSIE'), // Hack for IE 11 as the LAST one so you know not match the above
);
// Next get the name of the useragent yes seperately and for good reason
foreach ($browser_list as $item) {
echo $item['search_string'];
if (stripos($userAgent, $item['search_string']) !== false) {
$bname = $item['bname'];
$matchname = $item['matchname'];
$ub = $item['ub'];
echo "breaking";
break;
}
}
但是,由于UserAgent包含了所有的browsername,我面临的问题。
还有,为什么Opera的用户如此奇怪?
Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.125 Safari/537.36 OPR/30.0.1835.88
您必须首先在用户代理中搜索"OPR/"字符串。这就是Opera与其他浏览器的不同之处。
如果找到这个字符串,停止搜索。,继续。这样就不会和其他浏览器混淆了。
新浏览器通常都很擅长跟上新标准,就连微软的"Edge"浏览器也能跟上速度。
因此,除了Firefox之外,所有的浏览器制造商都在useragent字符串中包含"Chrome"answers"Safari",以确保对其他浏览器进行浏览器嗅探以降低功能的站点显示完整的功能。请参阅对相关问题的回答,其中有更多详细信息。
查看浏览器检测的详细演练
一般来说,你应该避免浏览器检测,而在可能的情况下使用特性检测,但这必须在需要特殊功能的客户端完成。
特别是关于Opera标签,在12版之前,当他们使用自己的"Presto"引擎时,它被识别为"Opera",但在那之后,他们开始使用基于"Blink"的引擎,所以他们不得不开始使用不同的标签来区分旧的Opera引擎。
<子>事实上,仍有相当多的用户在使用Opera 12,主要不是因为HTML引擎,而是因为它的一些高级特性,比如内置的电子邮件客户端。 子>
在我的测试站点中,我使用以下javascript代码来嗅探用户代理并提取浏览器和版本信息以便在页面上显示。我包含这个是为了可视化用户代理嗅探的复杂程度。这段代码还支持您可能不知道的浏览器,如果他们遵循模式,将其唯一的浏览器/版本作为列表中的最后一个(这似乎是最新浏览器的常见模式-除了Chrome)。
var browserName = navigator.appName;
var fullVersion = ''+parseFloat(navigator.appVersion);
var majorVersion = parseInt(navigator.appVersion,10);
var nVer = navigator.appVersion;
var nAgt = navigator.userAgent;
var nameOffset,verOffset,ix;
// In Opera (Presto, up to version 12), the true version is after "Opera" or after "Version"
if ((verOffset=nAgt.indexOf("Opera"))!=-1) {
browserName = "Opera";
fullVersion = nAgt.substring(verOffset+6);
if ((verOffset=nAgt.indexOf("Version"))!=-1)
fullVersion = nAgt.substring(verOffset+8);
}
// In MSIE, the true version is after "MSIE" in userAgent
else if ((verOffset=nAgt.indexOf("MSIE"))!=-1) {
browserName = "Microsoft Internet Explorer";
fullVersion = nAgt.substring(verOffset+5);
}
// In MSIE 11, the string "MSIE" is not longer present in userAgent
// Check for the engine "Trident" instead
else if ((verOffset=nAgt.indexOf("Trident"))!=-1) {
browserName = "Microsoft Internet Explorer";
verOffset = nAgt.indexOf("rv:");
fullVersion = nAgt.substring(verOffset+3);
}
// In Safari, the true version is after "Safari" or after "Version"
// Nowdays, most browsers include "Safari", so you also need to make sure it does NOT contain "Chrom" (as they also include "Crome", but Safari don't.
else if ((verOffset=nAgt.indexOf("Safari"))!=-1 && nAgt.indexOf("Chrom")<0) {
browserName = "Safari";
fullVersion = nAgt.substring(verOffset+7);
if ((verOffset=nAgt.indexOf("Version"))!=-1)
fullVersion = nAgt.substring(verOffset+8);
}
// In most other browsers, "name/version" is at the end of userAgent
else if ( (nameOffset=nAgt.lastIndexOf(' ')+1) <
(verOffset=nAgt.lastIndexOf('/')) )
{
browserName = nAgt.substring(nameOffset,verOffset);
if (browserName==="Safari") {
// Safari is last when browser is Chrome.
// Safari is handled already, so this has to be Chrome!
verOffset=nAgt.indexOf("Chrome") + 6;
browserName = "Chrome";
}
fullVersion = nAgt.substring(verOffset+1);
if (browserName.toLowerCase()==browserName.toUpperCase()) {
browserName = navigator.appName;
}
}
// trim the fullVersion string at semicolon/space if present
if ((ix=fullVersion.indexOf(";"))!=-1)
fullVersion=fullVersion.substring(0,ix);
if ((ix=fullVersion.indexOf(" "))!=-1)
fullVersion=fullVersion.substring(0,ix);
majorVersion = parseInt(''+fullVersion,10);
if (isNaN(majorVersion)) {
fullVersion = ''+parseFloat(navigator.appVersion);
majorVersion = parseInt(navigator.appVersion,10);
}
var engine = null;
if (window.navigator.appName == "Microsoft Internet Explorer")
{
// This is an IE browser. What mode is the engine in?
if (document.documentMode) // IE8 or later
engine = document.documentMode;
else // IE 5-7
{
engine = 5; // Assume quirks mode unless proven otherwise
if (document.compatMode)
{
if (document.compatMode == "CSS1Compat")
engine = 7; // standards mode
}
// There is no test for IE6 standards mode because that mode
// was replaced by IE7 standards mode; there is no emulation.
}
// the engine variable now contains the document compatibility mode.
}
var browserDetailsContent = ''
+'<li><b>Browser name: </b>' + browserName+'</li>'
+'<li><b>Full version: </b>' + fullVersion+'</li>'
+'<li><b>Major version: </b>' + majorVersion+'</li>'
+'<li><b>navigator.appVersion: </b>' + navigator.appVersion+'</li>'
+'<li><b>navigator.appMinorVersion: </b>' + navigator.appMinorVersion+'</li>'
+'<li><b>navigator.appCodeName: </b>' + navigator.appCodeName+'</li>'
+'<li><b>navigator.appName: </b>' + navigator.appName+'</li>'
+'<li><b>navigator.userAgent: </b>' + navigator.userAgent+'</li>'
+'<li><b>Internet Explorer engine: </b>' + engine+'</li>'
;
document.write(browserDetailsContent);