Detectar dispositivo móvil con PHP

Diferenciar entre dispositivos móviles y navegadores de escritorio con PHP

Un dilema a la hora de desarrollar contenidos para móviles es cómo diferenciar entre dispositivos móviles y navegadores de escritorio. La manera adecuada de hacer esto es usando una base de datos de todos los dispositivos móviles que existen, tales como DeviceAtlas ó WURFL (acá se explica cómo). Pero existen algunos inconvenientes.

Menos mal que siempre en el desarrollo de aplicaciones existen soluciones alternas (claro no tan fiables en este caso) que cubren esta necesidad.

El siguiente código PHP detecta el dispositivo móvil que está solicitando una petición a nuestra web y de acuerdo a ello mostrará un contenido más compacto y ligero.

El código se basa en una lista de los más conocidos navegadores móviles (alrededor de 90) y algunos casos especiales para Opera Mini, estándares W3C y algunos navegadores para Windows.

He probado este código con un navegador de escritorio y 2 navegadores móviles distintos. El resultado ha sido favorable.

<?php
$mobile_browser = '0';

//$_SERVER['HTTP_USER_AGENT'] -> el agente de usuario que está accediendo a la página.
//preg_match -> Realizar una comparación de expresión regular

if(preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone)/i',strtolower($_SERVER['HTTP_USER_AGENT']))){
$mobile_browser++;
}

//$_SERVER['HTTP_ACCEPT'] -> Indica los tipos MIME que el cliente puede recibir.
if((strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml')>0) or
((isset($_SERVER['HTTP_X_WAP_PROFILE']) or isset($_SERVER['HTTP_PROFILE'])))){
$mobile_browser++;
}

$mobile_ua = strtolower(substr($_SERVER['HTTP_USER_AGENT'],0,4));
$mobile_agents = array(
'w3c ','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',
'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',
'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',
'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',
'newt','noki','oper','palm','pana','pant','phil','play','port','prox',
'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',
'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',
'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',
'wapr','webc','winw','winw','xda','xda-');

//buscar agentes en el array de agentes
if(in_array($mobile_ua,$mobile_agents)){
$mobile_browser++;
}

//$_SERVER['ALL_HTTP'] -> Todas las cabeceras HTTP
//strpos -> Primera aparicion de una cadena dentro de otra
if(strpos(strtolower($_SERVER['ALL_HTTP']),'OperaMini')>0) {
$mobile_browser++;
}
if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']),'windows')>0) {
$mobile_browser=0;
}

if($mobile_browser>0){
// Mostrar contenido para dispositivos móviles
// Estos pueden ser más ligeros: un titulo, resumen y algunos enlaces.
// Aca puede redirigir a la ruta donde este el contenido para moviles
// Por ejemplo: http://miweb.com/movil ó http://movil.miweb.com
echo 'hola navegador cell phone';
}else{
// Contenido que se puede apreciar en navegadores de escritorio
echo 'hola navegador normal';
}
?>

Este código lo subí a https://www.ribosomatic.com/ejemplos/ejemplo.php y pueden probarlo con su dispositivo móvil, el mensaje deberá ser: hola navegador cell phone.

24 thoughts on “Detectar dispositivo móvil con PHP

  1. Aqui va la version ASP 3.0
    —————————————————-
    0 Or HttpWap = “” Or HttpProfile = “” Then
    mobile_browser = mobile_browser + 1
    End if
    Dim mobile_ua
    mobile_ua = LCase(MID(HttpUserAgent, 1 , 4))
    Dim mobile_agents
    mobile_agents = Array(“w3c”,”acs-“,”alav”,”alca”,”amoi”,”audi”,”avan”,”benq”,”bird”,”blac”,”blaz”,”brew”,”cell”,”cldc”,”cmd-“,”dang”,”doco”,”eric”,”hipt”,”inno”,”ipaq”,”java”,”jigs”,”kddi”,”keji”,”leno”,”lg-c”,”lg-d”,”lg-g”,”lge-“,”maui”,”maxo”,”midp”,”mits”,”mmef”,”mobi”,”mot-“,”moto”,”mwbp”,”nec-“,”newt”,”noki”,”oper”,”palm”,”pana”,”pant”,”phil”,”play”,”port”,”prox”,”qwap”,”sage”,”sams”,”sany”,”sch-“,”sec-“,”send”,”seri”,”sgh-“,”shar”,”sie-“,”siem”,”smal”,”smar”,”sony”,”sph-“,”symb”,”t-mo”,”teli”,”tim-“,”tosh”,”tsm-“,”upg1″,”upsi”,”vk-v”,”voda”,”wap-“,”wapa”,”wapi”,”wapp”, “wapr”,”webc”,”winw”,”winw”,”xda”,”xda-“)
    For i=0 To UBound(mobile_agents)
    If mobile_ua = mobile_agents(i) Then
    mobile_browser = mobile_browser + 1
    End if
    next
    Dim AllHttp
    AllHttp = LCase(Request.ServerVariables(“ALL_HTTP”))
    If InStr(AllHttp, “OperaMini”) > 0 Then
    mobile_browser = mobile_browser + 1
    End If
    If InStr(HttpUserAgent, “windows”) > 0 Then
    mobile_browser = 0
    End if
    If mobile_browser>0 Then
    ‘Datos enviados por Wap
    else
    ‘Datos enviado vía Web
    End If
    %>

  2. Hola, me ha servido mucho tu post, quería darte las gracias por compartirlo.
    Tengo una duda que igual puedes resolverme. Necesito actualizar ese listado de mobile_agents que usas, pero no encuentro donde puedo sacar un listado así. Si me pudieses decir, sería genial.
    muchas gracias

  3. Esta línea:
    if(strpos(strtolower($_SERVER[‘HTTP_USER_AGENT’]),’windows’)>0) {
    $mobile_browser=0;
    }
    con este user agent:
    Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.12)
    Mostrará la página estándar no la pequeña.
    Creo que corresponde a unas handheld HP que traen Windpws

  4. Tengo una pregunta..tengo que hacer un Site aparte con las medidas reducidas para móviles y el código las direcciona?? o suficiente con el site para escritorio y el código las reduce a la medida de los móviles???
    Saludos.

  5. la verdad que esta re piola, habria que ir actualizando la lista asi podemos pegarla siempre con los moviles nuevos! te felicito, esta piola x2 =)

  6. Un código muy útil pero planteo un par de cuestiones:
    Como menciona Pollo, la línea que vuelve a asignar 0 a mobile_browser si encuentra “windows” dará falsos negativos en terminales con Windows mobile ¿Cierto?
    Propongo usar este otro comparador:
    If InStr(HttpUserAgent, “windows”) > 0 And InStr(HttpUserAgent, “mobile”) = 0 Then
    y ¿qué pasa con los sistemas GNU/linux? Mi firefox en Ubuntu lo detecta como móvil, propongo usar este código después del de windows:
    If InStr(HttpUserAgent, “linux”) > 0 Then
    mobile_browser = 0
    End if
    La pregunta es: ¿hay algún terminal móvil que use un user-agent que contenga “linux”? en este caso también dará un falso negativo.
    Si alguien tiene repuestas, las agradezco.
    Un saludo y gracias por el post.

  7. Aquí la versión que a nosotros nos sirvio, detecta Iphone, Ipod y Ipad.
    (kliaki.com – desarrollo web)
    el agente de usuario que está accediendo a la página.
    //preg_match -> Realizar una comparación de expresión regular
    if(preg_match(‘/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone)/i’,strtolower($_SERVER[‘HTTP_USER_AGENT’]))){
    $mobile_browser++;
    }
    //$_SERVER[‘HTTP_ACCEPT’] -> Indica los tipos MIME que el cliente puede recibir.
    if((strpos(strtolower($_SERVER[‘HTTP_ACCEPT’]),’application/vnd.wap.xhtml+xml’)>0) or
    ((isset($_SERVER[‘HTTP_X_WAP_PROFILE’]) or isset($_SERVER[‘HTTP_PROFILE’])))){
    $mobile_browser++;
    }
    if(strstr($_SERVER[‘HTTP_USER_AGENT’],’iPhone’) || strstr($_SERVER[‘HTTP_USER_AGENT’],’iPod’) || strstr($_SERVER[‘HTTP_USER_AGENT’],’iPad’)){
    $mobile_browser++;
    }
    $mobile_ua = strtolower(substr($_SERVER[‘HTTP_USER_AGENT’],0,4));
    $mobile_agents = array(
    ‘w3c ‘,’acs-‘,’alav’,’alca’,’amoi’,’audi’,’avan’,’benq’,’bird’,’blac’,
    ‘blaz’,’brew’,’cell’,’cldc’,’cmd-‘,’dang’,’doco’,’eric’,’hipt’,’inno’,
    ‘ipaq’,’java’,’jigs’,’kddi’,’keji’,’leno’,’lg-c’,’lg-d’,’lg-g’,’lge-‘,
    ‘maui’,’maxo’,’midp’,’mits’,’mmef’,’mobi’,’mot-‘,’moto’,’mwbp’,’nec-‘,
    ‘newt’,’noki’,’oper’,’palm’,’pana’,’pant’,’phil’,’play’,’port’,’prox’,
    ‘qwap’,’sage’,’sams’,’sany’,’sch-‘,’sec-‘,’send’,’seri’,’sgh-‘,’shar’,
    ‘sie-‘,’siem’,’smal’,’smar’,’sony’,’sph-‘,’symb’,’t-mo’,’teli’,’tim-‘,
    ‘tosh’,’tsm-‘,’upg1′,’upsi’,’vk-v’,’voda’,’wap-‘,’wapa’,’wapi’,’wapp’,
    ‘wapr’,’webc’,’winw’,’winw’,’xda’,’xda-‘);
    //buscar agentes en el array de agentes
    if(in_array($mobile_ua,$mobile_agents)){
    $mobile_browser++;
    }
    //$_SERVER[‘ALL_HTTP’] -> Todas las cabeceras HTTP
    //strpos -> Primera aparicion de una cadena dentro de otra
    if(strpos(strtolower($_SERVER[‘ALL_HTTP’]),’OperaMini’)>0) {
    $mobile_browser++;
    }
    if(strpos(strtolower($_SERVER[‘HTTP_USER_AGENT’]),’windows’)>0) {
    $mobile_browser=0;
    }
    if($mobile_browser>0){
    // Mostrar contenido para dispositivos móviles
    // Estos pueden ser más ligeros: un titulo, resumen y algunos enlaces.
    // Aca puede redirigir a la ruta donde este el contenido para moviles
    // Por ejemplo: http://miweb.com/movil ó http://movil.miweb.com
    header( ‘location:/movil/’);
    exit();
    }else{
    // Contenido que se puede apreciar en navegadores de escritorio
    header( ‘location:/web/’);
    exit();
    }
    ?>

  8. hola esta muy bien el codigo muchas gracias me ayudara con el proyecto q tengo muchas gracias ing y gracias ictius Ali

  9. Se puede utilizar este codigo para no cargar por ejemplo un slider si se entra de un movil ???
    Por ejemplo en medio del markup html
    if($mobile_browser<=0){

    }
    Gracias.

Leave a Reply

Your email address will not be published. Required fields are marked *

Proudly powered by WordPress | Theme: Wanderz Blog by Crimson Themes.