如何在PHP中有效地查找特定的子字符串?

时间:2011-04-12 14:33:29

标签: php regex substring

好的,我知道怎么做但我对这个问题更好/更优雅的解决方案(如果有的话)感兴趣。

想象一下,我有以下字符串:

  

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结合,然后我在匹配之间循环,然后比较版本字符串。它有效,但它远非优雅。关于如何改进这个的任何想法?

请记住:

  • 该字符串可以包含任意数量的MSIE(甚至没有)
  • MSIE不区分大小写
  • MSIE之后是一个空格(空格,制表符......),然后是版本。版本可以包含数字字母和点。版本字符串以空格结束,a;或者行尾。

谢谢!

5 个答案:

答案 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()不区分大小写。