【问题标题】:Simplest way to detect a mobile device in PHP用 PHP 检测移动设备的最简单方法
【发布时间】:2011-05-06 06:38:58
【问题描述】:

判断用户是否使用移动设备通过 PHP 浏览我的网站的最简单方法是什么?

我遇到了许多可以使用的类,但我希望有一个简单的 if 条件!

有什么办法可以做到吗?

【问题讨论】:

标签: php mobile


【解决方案1】:

这是一个来源:

代码:

<?php

$useragent=$_SERVER['HTTP_USER_AGENT'];

if(preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i',$useragent)||preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i',substr($useragent,0,4)))

header('Location: http://detectmobilebrowser.com/mobile');

?>

【讨论】:

  • 可以伪造 HTTP_USER_AGENT 吗?
  • @naveed 请注意,这似乎不再有效。使用 Chrome 的移动浏览器在 IOS 8.1 中测试。不过,贾斯汀正在为我工​​作。
  • @kavior.com 是的,它可以被伪造,但如果他们愿意,我们应该允许人们伪造......因为这是他们的意图,为什么要阻止人们做他们特别想做的事(即加载特别是出于某种原因的桌面版本)?
  • 这个答案现在已经过时了。有很多误报,OSX 上的 safari 被检测为移动设备,OSX 上的 Chrome 被检测为移动设备。
  • @DevZer0:好的。您可以在此答案的末尾添加最新的解决方案。
【解决方案2】:

我用 PHP 写了this script to detect a mobile browser

代码通过 preg_match() 匹配经过数百次测试后仅在移动设备用户代理字符串中找到的单词,根据用户代理字符串检测用户。它在所有当前的移动设备上都具有 100% 的准确性,我目前正在对其进行更新以支持更多的移动设备。代码名为isMobile,如下:

function isMobile() {
    return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
}

你可以这样使用它:

// Use the function
if(isMobile()){
    // Do something for only mobile users
}
else {
    // Do something for only desktop users
}

要将用户重定向到您的移动网站,我会这样做:

// Create the function, so you can use it
function isMobile() {
    return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
}
// If the user is on a mobile device, redirect them
if(isMobile()){
    header("Location: http://m.yoursite.com/");
}

如果您有任何问题,请告诉我,祝您好运!

【讨论】:

【解决方案3】:

我发现mobile detect 非常简单,你可以使用isMobile() 函数:)

【讨论】:

  • @showdev 它没有检测到桌面 chrome “检查”模式(相反,它认为它是移动设备)
  • @showdev 你现在解决这个问题了吗?
【解决方案4】:
function isMobileDev(){
    if(!empty($_SERVER['HTTP_USER_AGENT'])){
       $user_ag = $_SERVER['HTTP_USER_AGENT'];
       if(preg_match('/(Mobile|Android|Tablet|GoBrowser|[0-9]x[0-9]*|uZardWeb\/|Mini|Doris\/|Skyfire\/|iPhone|Fennec\/|Maemo|Iris\/|CLDC\-|Mobi\/)/uis',$user_ag)){
          return true;
       };
    };
    return false;
}

【讨论】:

    【解决方案5】:

    您只需点击链接即可。它非常简单且易于使用。我正在使用这个。它工作正常。

    http://mobiledetect.net/

    这样使用

    //include the file
    require_once 'Mobile_Detect.php';
    $detect = new Mobile_Detect;
    
    // Any mobile device (phones or tablets).
    if ( $detect->isMobile() ) {
     //do some code
    }
    
    // Any tablet device.
    if( $detect->isTablet() ){
     //do some code
    }
    

    【讨论】:

    • 不起作用,因为它将桌面 chrome 检查模式识别为移动
    【解决方案6】:

    直到现在,我一直在想,为什么有人没有对使用 implode() 的公认答案稍作改动,以提高代码的可读性。就这样吧:

    <?php
    $uaFull = strtolower($_SERVER['HTTP_USER_AGENT']);
    $uaStart = substr($uaFull, 0, 4);
    
    $uaPhone = [
        '(android|bb\d+|meego).+mobile',
        'avantgo',
        'bada\/',
        'blackberry',
        'blazer',
        'compal',
        'elaine',
        'fennec',
        'hiptop',
        'iemobile',
        'ip(hone|od)',
        'iris',
        'kindle',
        'lge ',
        'maemo',
        'midp',
        'mmp',
        'mobile.+firefox',
        'netfront',
        'opera m(ob|in)i',
        'palm( os)?',
        'phone',
        'p(ixi|re)\/',
        'plucker',
        'pocket',
        'psp',
        'series(4|6)0',
        'symbian',
        'treo',
        'up\.(browser|link)',
        'vodafone',
        'wap',
        'windows ce',
        'xda',
        'xiino'
    ];
    
    $uaMobile = [
        '1207', 
        '6310', 
        '6590', 
        '3gso', 
        '4thp', 
        '50[1-6]i', 
        '770s', 
        '802s', 
        'a wa', 
        'abac|ac(er|oo|s\-)', 
        'ai(ko|rn)', 
        'al(av|ca|co)', 
        'amoi', 
        'an(ex|ny|yw)', 
        'aptu', 
        'ar(ch|go)', 
        'as(te|us)', 
        'attw', 
        'au(di|\-m|r |s )', 
        'avan', 
        'be(ck|ll|nq)', 
        'bi(lb|rd)', 
        'bl(ac|az)', 
        'br(e|v)w', 
        'bumb', 
        'bw\-(n|u)', 
        'c55\/', 
        'capi', 
        'ccwa', 
        'cdm\-', 
        'cell', 
        'chtm', 
        'cldc', 
        'cmd\-', 
        'co(mp|nd)', 
        'craw', 
        'da(it|ll|ng)', 
        'dbte', 
        'dc\-s', 
        'devi', 
        'dica', 
        'dmob', 
        'do(c|p)o', 
        'ds(12|\-d)', 
        'el(49|ai)', 
        'em(l2|ul)', 
        'er(ic|k0)', 
        'esl8', 
        'ez([4-7]0|os|wa|ze)', 
        'fetc', 
        'fly(\-|_)', 
        'g1 u', 
        'g560', 
        'gene', 
        'gf\-5', 
        'g\-mo', 
        'go(\.w|od)', 
        'gr(ad|un)', 
        'haie', 
        'hcit', 
        'hd\-(m|p|t)', 
        'hei\-', 
        'hi(pt|ta)', 
        'hp( i|ip)', 
        'hs\-c', 
        'ht(c(\-| |_|a|g|p|s|t)|tp)', 
        'hu(aw|tc)', 
        'i\-(20|go|ma)', 
        'i230', 
        'iac( |\-|\/)', 
        'ibro', 
        'idea', 
        'ig01', 
        'ikom', 
        'im1k', 
        'inno', 
        'ipaq', 
        'iris', 
        'ja(t|v)a', 
        'jbro', 
        'jemu', 
        'jigs', 
        'kddi', 
        'keji', 
        'kgt( |\/)', 
        'klon', 
        'kpt ', 
        'kwc\-', 
        'kyo(c|k)', 
        'le(no|xi)', 
        'lg( g|\/(k|l|u)|50|54|\-[a-w])', 
        'libw', 
        'lynx', 
        'm1\-w', 
        'm3ga', 
        'm50\/', 
        'ma(te|ui|xo)', 
        'mc(01|21|ca)', 
        'm\-cr', 
        'me(rc|ri)', 
        'mi(o8|oa|ts)', 
        'mmef', 
        'mo(01|02|bi|de|do|t(\-| |o|v)|zz)', 
        'mt(50|p1|v )', 
        'mwbp', 
        'mywa', 
        'n10[0-2]', 
        'n20[2-3]', 
        'n30(0|2)', 
        'n50(0|2|5)', 
        'n7(0(0|1)|10)', 
        'ne((c|m)\-|on|tf|wf|wg|wt)', 
        'nok(6|i)', 
        'nzph', 
        'o2im', 
        'op(ti|wv)', 
        'oran', 
        'owg1', 
        'p800', 
        'pan(a|d|t)', 
        'pdxg', 
        'pg(13|\-([1-8]|c))', 
        'phil', 
        'pire', 
        'pl(ay|uc)', 
        'pn\-2', 
        'po(ck|rt|se)', 
        'prox', 
        'psio', 
        'pt\-g', 
        'qa\-a', 
        'qc(07|12|21|32|60|\-[2-7]|i\-)', 
        'qtek', 
        'r380', 
        'r600', 
        'raks', 
        'rim9', 
        'ro(ve|zo)', 
        's55\/', 
        'sa(ge|ma|mm|ms|ny|va)', 
        'sc(01|h\-|oo|p\-)', 
        'sdk\/', 
        'se(c(\-|0|1)|47|mc|nd|ri)', 
        'sgh\-', 
        'shar', 
        'sie(\-|m)', 
        'sk\-0', 
        'sl(45|id)', 
        'sm(al|ar|b3|it|t5)', 
        'so(ft|ny)', 
        'sp(01|h\-|v\-|v )', 
        'sy(01|mb)', 
        't2(18|50)', 
        't6(00|10|18)', 
        'ta(gt|lk)', 
        'tcl\-', 
        'tdg\-', 
        'tel(i|m)', 
        'tim\-', 
        't\-mo', 
        'to(pl|sh)', 
        'ts(70|m\-|m3|m5)', 
        'tx\-9', 
        'up(\.b|g1|si)', 
        'utst', 
        'v400', 
        'v750', 
        'veri', 
        'vi(rg|te)', 
        'vk(40|5[0-3]|\-v)', 
        'vm40', 
        'voda', 
        'vulc', 
        'vx(52|53|60|61|70|80|81|83|85|98)', 
        'w3c(\-| )', 
        'webc', 
        'whit', 
        'wi(g |nc|nw)', 
        'wmlb', 
        'wonu', 
        'x700', 
        'yas\-', 
        'your', 
        'zeto', 
        'zte\-'
    ];
    
    $isPhone = preg_match('/' . implode($uaPhone, '|') . '/i', $uaFull);
    $isMobile = preg_match('/' . implode($uaMobile, '|') . '/i', $uaStart);
    
    if($isPhone || $isMobile) {
        // do something with that device
    } else {
        // process normally
    }
    

    【讨论】:

      【解决方案7】:

      没有可靠的方法。您也许可以查看user-agent string,但这可以被欺骗或省略。或者,您可以使用 GeoIP 服务来查找客户端的 IP 地址,但同样可以轻松绕过。

      【讨论】:

      • GeoIP 并没有真正的帮助。即使您可以确定他们的 IP 属于移动网络,他们也可能将连接绑定到台式计算机。如果它不是移动网络,你真的没有什么可以通过 Wi-Fi 连接所有设备。此外,您还有维护 IP 范围的全球数据库的问题。使用用户代理,即使它并不完美,我认为它更可靠。提供错误的浏览器内容并不是真正的安全问题,所以谁在乎呢?如果有人在欺骗 UA,他们很可能已经知道自己在做什么。
      • 11 年前你是对的,用户代理越来越没用了,例如他们不再将 Safari 和 Firefox iPad 报告为移动设备。 Chrome 仍然可以,但我猜它很快就会效仿。
      【解决方案8】:
      <?php 
      
      //-- Very simple way
      $useragent = $_SERVER['HTTP_USER_AGENT']; 
      $iPod = stripos($useragent, "iPod"); 
      $iPad = stripos($useragent, "iPad"); 
      $iPhone = stripos($useragent, "iPhone");
      $Android = stripos($useragent, "Android"); 
      $iOS = stripos($useragent, "iOS");
      //-- You can add billion devices 
      
      $DEVICE = ($iPod||$iPad||$iPhone||$Android||$iOS);
      
      if (!$DEVICE) { ?>
      
      <!-- What you want for all non-mobile devices. Anything with all HTML, PHP, CSS, even full page codes-->
      
      <?php }else{ ?> 
      
      <!-- What you want for all mobile devices. Anything with all HTML, PHP, CSS, even full page codes --> 
      
      <?php } ?>
      

      【讨论】:

        【解决方案9】:

        您只需要包含可以从Mobile device detection in PHP 页面找到的user_agent.php 文件并使用以下代码。

        <?php
        //include file
        include_once 'user_agent.php';
        
        //create an instance of UserAgent class
        $ua = new UserAgent();
        
        //if site is accessed from mobile, then redirect to the mobile site.
        if($ua->is_mobile()){
           header("Location:http://m.codexworld.com");
           exit;
        }
        ?>
        

        【讨论】:

          【解决方案10】:

          PHP device detection from 51Degrees.com 完全符合您的要求 - 检测移动设备以及与检测到的设备相关的各种属性。它使用简单,无需维护。只需 4 个简单的步骤即可完成设置:

          1. 从 http://sourceforge.net/projects/fiftyone/ 下载 Zip 文件。
          2. 将文件解压缩到 PHP 服务器的目录中。
          3. 然后将以下代码添加到您的 PHP 页面:
          4. require_once 'path/to/core/51Degrees.php';
            require_once 'path/to/core/51Degrees_usage.php';
            
          5. 所有可用的设备信息都将包含在 $_51d 数组中:
          6. if ($_51d['IsMobile'])
            {
                //Start coding for a mobile device here.
            }
            

          51Degrees 设备检测器不使用正则表达式进行检测。只有 HTTP 标头的重要部分用于匹配设备。这使得该解决方案最快(在普通硬件上每秒检测 5 000 000 次)和最准确(99.97% 准确度),因为每周都会将数百个新设备添加到数据库中(支持的设备类型包括控制台、智能电视、电子阅读器、平板电脑等)。

          软件是在 Mozilla Public License 2 下分发的开源软件,与商业和开源项目兼容。作为奖励,51Degrees 解决方案还包含一个补充PHP image optimiser,它可以自动调整移动设备的图像大小。

          默认情况下,51Degrees PHP 设备检测器使用免费的 Lite 数据文件,其中包含超过 30000 个设备和每个设备的 50 个属性。 Lite 文件每 3 个月更新一次。如果您想获得有关请求移动设备的更高级别的详细信息,则可以使用 Premium 和 Enterprise 数据文件。 Premium 包含超过 70000 台设备和每周更新的每台设备的 100 个属性。 Enterprise 每天更新,包含超过 150000 台设备,每个设备有 150 个属性。

          Full list of device properties.
          Compare data files.

          【讨论】:

          • 那个软件很烦人。不支持 IIS,不支持 php 库。
          【解决方案11】:

          您还可以使用第三方 api 通过用户代理字符串进行设备检测。一种这样的服务是www.useragentinfo.co。只需注册并获取您的 api 令牌,以下是您通过 PHP 获取设备信息的方式:

          <?php
          $useragent = $_SERVER['HTTP_USER_AGENT'];
          // get api token at https://www.useragentinfo.co/
          $token = "<api-token>";
          $url = "https://www.useragentinfo.co/api/v1/device/";
          
          $data = array('useragent' => $useragent);
          
          $headers = array();
          $headers[] = "Content-type: application/json";
          $headers[] = "Authorization: Token " . $token;
          
          $curl = curl_init($url);
          curl_setopt($curl, CURLOPT_HEADER, false);
          curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
          curl_setopt($curl, CURLOPT_POST, true);
          curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
          
          $json_response = curl_exec($curl);
          
          $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
          
          if ($status != 200 ) {
              die("Error: call to URL $url failed with status $status, response $json_response, curl_error " . curl_error($curl) . ", curl_errno " . curl_errno($curl));
          }
          
          curl_close($curl);
          
          echo $json_response;
          ?>
          

          以下是访问者使用 iPhone 时的示例响应:

          {
            "device_type":"SmartPhone",
            "browser_version":"5.1",
            "os":"iOS",
            "os_version":"5.1",
            "device_brand":"Apple",
            "bot":false,
            "browser":"Mobile Safari",
            "device_model":"iPhone"
          }
          

          【讨论】:

          • 这行得通!这个简单的脚本似乎是我发现的最好的脚本之一:(直到现在)它是我发现的唯一可以检测到我的华硕 ZenPad 平板电脑的脚本!但请注意:他们将 $url 更改为 https://useragentinfo.co/device,请参阅他们的页面 https://useragentinfo.co:它提供了执行 curl 的 bash 代码,但实际上您可以用您的 PHP 行替换它。但是,您应该省略“Authorization: Token ..”这一行,因为它似乎不再需要(而且我看不到获取该 API 密钥的方法)。
          • 没有得到回应。只是显示 {} 我认为需要 API 令牌,请您指导我如何生成令牌。
          • $data = array('user_agent' => $useragent);它应该是: $data = array('useragent' => $useragent);
          • 域不可达怎么办?
          • 域不再可用。有新的吗?
          【解决方案12】:

          如果您的服务器支持 get_browser(自 PHP 4 起可用),则非常简单。他们有一个内置功能可以满足您的要求。

          参考:https://www.php.net/manual/en/function.get-browser.php

          <?php
          $browser = get_browser(null, true);
          if($browser['ismobiledevice']) { 
                // Device is mobile 
          }
          ?>
          

          【讨论】:

          • 在阅读文档时,我发现这个函数或多或少只是用户代理标头的包装器,它返回它被解析为一个数组。我错了吗?
          • 只要你的服务器管理员有browscap.ini,它就提供了比用户议程标题更多的数据。它可以告诉您浏览器支持什么,并且比输入人们正在编写的所有正则表达式要容易得多。
          • 更短 — 毫无疑问。我只是注意到它们或多或少基于相同的数据。
          • @shaedrich 使用内置函数还具有随着新移动设备(和新版本的用户代理字符串)发布而更新的优势。
          • 对我来说,当我在 chrome 中的 mobileview 中打开网页时,它不起作用。而是 $_SERVER['HTTP_USER_AGENT']; 正在按预期工作
          【解决方案13】:
          function isMobile(){
             if(defined(isMobile))return isMobile;
             @define(isMobile,(!($HUA=@trim(@$_SERVER['HTTP_USER_AGENT']))?0:
             (
                preg_match('/(android|bb\d+|meego).+mobile|silk|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i'
                ,$HUA)
             ||
                preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i'
                ,$HUA)
             )
             ));
          }
          
          echo isMobile()?1:0;
          // OR
          echo isMobile?1:0;
          

          【讨论】:

            【解决方案14】:

            如果您关心屏幕尺寸,您可以将屏幕宽度和高度存储为 cookie 值(如果它们尚不存在),然后进行自我页面重定向。

            现在您在客户端和服务器端都有 cookie,可以使用它来确定手机、平板电脑和其他设备

            这里有一个简单的例子,你可以如何使用 JavaScript 来做到这一点。 警告! [此代码包含伪代码]。

            if (!getcookie("screen_size")) {
                var screen_width = screen.width;
                var screen_height = screen.height;
                setcookie("screen_size", screen_width+", " +screen_height);
                go2(geturl());
            }
            

            【讨论】:

              【解决方案15】:
              <?php
              $useragent=$_SERVER['HTTP_USER_AGENT'];
              if(preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i',$useragent)||preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i',substr($useragent,0,4)))
              {
                  echo('This is mobile device');
              }
              else
              {
                 echo('This is Desktop/Laptop device');
              }
              ?>
              

              【讨论】:

                【解决方案16】:

                这个简单的解决方案

                if(
                    
                    strpos($_SERVER['HTTP_USER_AGENT'],'Phone')
                    |
                    strpos($_SERVER['HTTP_USER_AGENT'],'Android')
                    
                    
                ){      echo "should be mobile";                }
                else{   echo "give them the desktop version";   }
                

                适用于我测试过的大多数设备(通过浏览器开发工具设备模拟)。

                当然,您可以使用echo($_SERVER['HTTP_USER_AGENT']); 自己查看使用的值。

                在我的案例中,唯一缺少的智能手机设备是 BlacBerryZ30,我也通过检查 'Touch' 修复了它。对于诺基亚 N9,我还检查了'Nokia'。如果发现“未选中”,显然可以将这些添加到更多设备。但是现在这可能比上面一些更复杂的字符串扫描模式更好/更快地理解。

                【讨论】:

                  【解决方案17】:

                  也许结合一些 javascript 和 PHP 可以达到目的

                  <?php
                  $string = '<script>';
                  $string .= 'if ( /Opera|OPR\/|Puffin|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) { ';
                  $string .= '        alert("CELL")';
                  $string .= '    } else {';
                  $string .= '        alert("NON CELL")';
                  $string .= '    }       ';  
                  $string .= '</script>'; 
                  echo $string;
                  ?>
                  

                  我也用纯 javascript 代替了它

                  【讨论】:

                  • 但它会在 Inspect 模式下将桌面 Chrome 识别为移动设备(尽管这是一个不错的概念)
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-12-29
                  • 2019-01-26
                  • 1970-01-01
                  • 2014-12-26
                  • 1970-01-01
                  相关资源
                  最近更新 更多