好的,我知道怎么做但我对这个问题更好/更优雅的解决方案(如果有的话)感兴趣。
想象一下,我有以下字符串:
Mozilla / 4.0(兼容; MSIE 7.0 ; Windows NT 5.1;三叉戟/ 4.0; GTB6.6; Mozilla / 4.0(兼容; MSIE 6.0 ; Windows NT 5.1; SV1); .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
我有兴趣在该字符串中找到最高的MSIE版本(在这种情况下为7.0)。
目前我使用explode和preg_match几次与str_replace结合,然后我在匹配之间循环,然后比较版本字符串。它有效,但它远非优雅。关于如何改进这个的任何想法?
请记住:
谢谢!
答案 0 :(得分:2)
尝试:
<?php
$str = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; GTB6.6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1), MSIE 8.7abc; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) MSIE 9.0';
if (preg_match_all('/msie\s*([^\s;$]+)/i', $str, $m)) {
usort($m[1], 'version_compare');
$max = array_pop($m[1]);
echo $max;
}
答案 1 :(得分:1)
如果您尝试实施浏览器检测,it's a lot more complex than this。
答案 2 :(得分:1)
这项工作可能已经为您完成。
您可能需要查找PHP的get_browser()
函数以及相关的browsecap.ini
文件。
但是,我通常会建议做浏览器检测通常是个坏主意。它基本上是不可靠的,因为浏览器可以伪造其用户代理字符串。即使浏览器没有这样做,它仍然可以被代理和安全软件更改或消隐。
答案 3 :(得分:1)
这样的事情:
$str = "Mozilla/4.0 (compatible; msie 7.0; Windows NT 5.1; Trident/4.0; GTB6.6; Mozilla/4.0 (compatible; MSIE 7.1; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
preg_match_all('/MSIE\s([\d.]+);/i', $str, $matches);
if(!empty($matches[1])){
echo "Max version found:" . max($matches[1]);
}else{
echo "None found";
}
答案 4 :(得分:0)
stripos()完全符合您的描述。我不确定如何比PHP更有效率。
返回haystack字符串中第一次出现needle的数字位置。 与strpos()不同,stripos()不区分大小写。