【问题标题】:Mobile browser detection?移动浏览器检测?
【发布时间】:2011-10-01 22:52:48
【问题描述】:

我们正在寻找一种方法来确定用户是否使用移动浏览器。 我们需要在 PHP 中通过解析用户代理字符串来做到这一点。我知道这种方法有很多注意事项,但我们确实需要这样做。

你有什么建议吗?一个好的(即使不是完美的)更新代码?

我知道 WURFL,我相信它很棒,但它不再免费用于非开源项目。 通过谷歌搜索,我还找到了这段代码:http://mobiforge.com/developing/story/lightweight-device-detection-php(以及一些变体),但我不确定。看起来它写得很糟糕(例如,当他们使用 $mobile_browser = '0' 并在整数周围加上引号时......)。

你能推荐一些东西吗?

谢谢,

亚历山德罗

【问题讨论】:

    标签: php mobile user-agent browser-detection


    【解决方案1】:

    您可以使用 PHP 的内置函数get_browser()。根据 PHP 手册,输出数组有 platform 字段,您可以使用它来检测移动浏览器。

    Mobiforge 还有一个lightweight mobile device detection 代码。

    【讨论】:

    • 您的第二个链接与我在 OP 中的链接相同...您阅读我的问题了吗?
    • 对不起,我没有意识到,我只是想帮助你。
    • 别担心。感谢回复!我刚刚意识到我的评论可能有点粗鲁:对不​​起!
    【解决方案2】:

    如果您不需要高级功能检测,可以使用此resource。我认为新的 WURFL api 是 AGPL,所以它们是免费的。无论如何你可以使用旧版本,不是吗?

    【讨论】:

    • 它可以免费下载和重新分发,但不能免费用于商业项目,除非您发布源代码(显然我们永远不会这样做)。许可证费用为 1,500 美元!
    • 好的,对不起,我认为像开源一样免费
    • 为后代澄清:WURFL(如原始问题中所引用)是具有商业许可的。在这个特定答案中,detectmobilebrowser.com 的链接是“发布到公共领域的免费且不受阻碍的软件”。
    【解决方案3】:

    我正在使用这个:

    $isMobile = (bool)preg_match('#\b(ip(hone|od)|android\b.+\bmobile|opera m(ob|in)i|windows (phone|ce)|blackberry'.
                        '|s(ymbian|eries60|amsung)|p(alm|rofile/midp|laystation portable)|nokia|fennec|htc[\-_]'.
                        '|up\.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\b#i', $_SERVER['HTTP_USER_AGENT'] );
    

    它很短,可以检测到大多数移动用户(或者更确切地说是智能手机)。 iPad 和 Android 平板电脑不会被归类为“移动设备”,因为它们的屏幕尺寸更大。

    如果你也想赶上平板电脑,你可以使用这个:

    $isMobile = (bool)preg_match('#\b(ip(hone|od|ad)|android|opera m(ob|in)i|windows (phone|ce)|blackberry|tablet'.
                        '|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp|laystation portable)|nokia|fennec|htc[\-_]'.
                        '|mobile|up\.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\b#i', $_SERVER['HTTP_USER_AGENT'] );
    

    【讨论】:

    • 我喜欢这段代码。干净简单!谢谢!如果我想添加 iPad 和所有其他平板电脑怎么办?我知道他们有更大的屏幕,但我需要将它们视为移动设备。对于 iPad,我认为我需要将 ip(hone|od) 替换为 ip(hone|od|ad),但对于 android 平板电脑和其他平板电脑怎么办? (触摸板和 PlayBook?)
    • 谢谢这很好用。我确实发现了三星 S3350 的问题,但 HTTP_USER_AGENT 返回(Mozilla/5.0(兼容;OpenWeb 5.7.2-10)Opera 8.54)我的正则表达式技能很少,所以没有尝试添加到您的表达式中。有接受者吗?
    【解决方案4】:

    Floern 感谢您的代码!!!

    我添加了 Hp TouchPad 平板电脑,其中包含:

    hpwos

    这里是:

    $isMobile = (bool)preg_match('#\b(ip(hone|od|ad)|android|opera m(ob|in)i|窗口 (phone|ce)|blackberry||hpwos|tablet'.'|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp|laystation 便携式)|诺基亚|fennec|htc[-_]'.'|mobile|up.browser|[1-4][0-9]{2}x[1-4][0-9]{2}) \双', $_SERVER['HTTP_USER_AGENT']);

    【讨论】:

      【解决方案5】:

      对不起,我之前看错了你的问题

      有一种非常简单的方法可以检测某人是在使用手机还是 PC

      这就是我的工作

      在我的表单显示结果中,我在表单数据捕获的最后添加以下内容;

          $msg .= "Referers: ".$_POST['Referers']. "\r\n";
      

      然后在我添加的字段下

        [[input type="hidden"  id="Referers" name="Referers" value="[[?php 
        echo "IP: " . $_SERVER['REMOTE_ADDR']; 
        echo "\nURL: " . $_SERVER['HTTP_REFERER']; 
      
      echo "\nWebsite: " . $URL;
      echo "\n\nBrowser Type:" . $_SERVER['HTTP_USER_AGENT'];
      ?]]"]]
      

      请注意,我更改了

      结果打印在我的电子邮件上是这样的::

      Referrers: IP: xxx.xxx.xxx.xxx // 我隐藏了这个

      网址:http://www.emailmarketingaustralia.com.au/Contact/index.php 网址:http://www.emailmarketingaustralia.com.au

      浏览器类型:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; HTC_Sensation_Z710e; en-in) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16

      有趣的是,我在澳大利亚,但 GEO-REGION 将我列为 en-in(印度)

      // 地理城市

      如果你想让IP显示城市和国家,你也可以从MAX MIND(www.maxmind.com)获取数据

      这简单干净,可以满足您的需求

      【讨论】:

        【解决方案6】:

        我正在使用Mobile_Detect class。 它几乎每周更新一次。该代码在 HTTP 标头和 User-Agent 字符串中查找“移动”设备的迹象。

        Demo ← 在您的移动设备上运行此程序

        您可能只会使用:

        include("Mobile_Detect.php");
        $detect = new Mobile_Detect();
        if ($detect->isMobile()) {
            // any mobile platform
        }
        

        该类还尝试通过以下方式检测平板电脑设备:

        if($detect->isTablet()){
            // any tablet
        }
        

        检测移动设备没有灵丹妙药,但在决定使用 WURLF、DeviceAtlas 等外部 API 之前,这是一个好的开始。

        【讨论】:

        • 喜欢这个脚本 - 定期更新,到目前为止对我们来说效果很好。我什至发现了一个不被算作平板电脑的稀有平板电脑,而创作者在几天内就将其添加了。好东西。
        【解决方案7】:

        另外两个想法是:

        1. 一些主要的运营商插入他们自己的标头:只要用户通过运营商网络,您可以使用它,如果您关心的话。
        2. 您可以使用 JavaScript 来检测屏幕大小。许多公司正在尝试通过制作小型网页来实现响应式设计:因此,这可能是一种更好、更简单的方法。此外,HTML5 具有媒体查询,可根据屏幕大小更改 css。

        【讨论】:

        • #1 的想法是有缺陷的,因为您不能仅仅依赖于使用蜂窝网络的用户。并非所有运营商都插入标题! #2 也不能正常工作,因为桌面 Web 浏览器的窗口可能会缩小,而且 - 最重要的是 - 我要求提供服务器端解决方案 :)
        • 并非所有运营商都插入标头 Qualcuno 是正确的。但你实际上可以检查那些做的。至于您的第二个声明,您可以从客户端到服务器进行通信。实际上,User-Agent 是从客户端到服务器的。我向您建议了一些替代方案,因为您已经有了其他好的建议。事实上,当用户减小窗口大小时,您认为媒体查询在桌面浏览器上会做什么?他们完全按照您认为“无法工作”的方式进行操作:他们将“响应式设计”调整为窗口宽度 - 可能不是用户想要的。例如。用户并排比较窗口