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 http://ribosomatic.com/ejemplos/ejemplo.php y pueden probarlo con su dispositivo móvil, el mensaje deberá ser: hola navegador cell phone.

Comentarios Comentarios formato RSS

  1. avatar Roberto comenta :

    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){

    <-- slider html -->

    }

    Gracias.

  2. avatar ulises comenta :

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

  3. avatar cetus comenta :

    @Kutus todos los android dicen linux en el user agent

  4. avatar marcos comenta :

    encontrar

  5. avatar Laura comenta :

    Muy bueno el código!

  6. avatar lester comenta :

    hola! me urge esto, soy muuy principiante, donde se supone que pongo ese codigo?? en el index???

  7. avatar Qclubscial comenta :

    Gracias me sirvio de mucha ayuda ¡¡¡

  8. avatar ictius Ali comenta :

    Aquí la versión que a nosotros nos sirvio, detecta Iphone, Ipod y Ipad.
    (kliaki.com - desarrollo web)

    <?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++;
    }

    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();
    }
    ?>

  9. avatar Franciso comenta :

    Interesante el codigo lo voy a probar ya que necesito culminar un proyecto de este tipo...

  10. avatar Carlos comenta :

    Muchas gracias me ha servido mucho!!!