Simplest way to detect a mobile device in PHP

479,674

Solution 1

Here is a source:

Code:

<?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');

?>

Solution 2

I wrote this script to detect a mobile browser in PHP.

The code detects a user based on the user-agent string by preg_match()ing words that are found in only mobile devices user-agent strings after hundreds of tests. It has 100% accuracy on all current mobile devices and I'm currently updating it to support more mobile devices as they come out. The code is called isMobile and is as follows:

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"]);
}

You can use it like this:

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

To redirect a user to your mobile site, I would do this:

// 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/");
}

Let me know if you have any questions and good luck!

Solution 3

I found mobile detect to be really simple and you can just use the isMobile() function :)

Solution 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;
}

Solution 5

Simply you can follow the link. its very simple and very easy to use. I am using this. Its working fine.

http://mobiledetect.net/

use like this

//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
}
Share:
479,674

Related videos on Youtube

Abs
Author by

Abs

Updated on January 20, 2022

Comments

  • Abs
    Abs over 2 years

    What is the simplest way to tell if a user is using a mobile device to browse my site using PHP?

    I have come across many classes that you can use but I was hoping for a simple if condition!

    Is there a way I can do this?

  • Justin DoCanto
    Justin DoCanto almost 12 years
    @RobertHarvey - im confused. they are all asking basically the same thing so what am i supposed to do, other than answer the question? tell them to use something else each time? i'm new here so im not sure if im supposed to link to the first answer?
  • Mladen Janjetovic
    Mladen Janjetovic over 10 years
    This keyword "tablet" is creating me a problem on some IE8 (PC) headers that have "Tablet PC 2.0" in response
  • datasn.io
    datasn.io about 9 years
    Could HTTP_USER_AGENT be faked?
  • James
    James over 8 years
    @naveed Just a heads up, this no longer seems to be working. Tested in IOS 8.1 using Chrome's mobile browser. Justin's is working for me though.
  • Nick Steele
    Nick Steele over 8 years
    @kavior.com Yes it can be faked, but we should allow people to fake if they wish... because that would be their intention, why stop people from doing what they specifically want (i.e. load the desktop version for some reason in particular)?
  • Mike
    Mike over 8 years
    GeoIP wouldn't really help. Even if you could determine that their IP belongs to a mobile network, they could be tethering the connection to a desktop computer. If it's not a mobile network you really no nothing all can devices connect through Wi-Fi. Also you have the problem of maintaining a global database of IP ranges. Using the user agent, even though it's not perfect, I would assume is much more reliable. It's not like it's really a security issue to serve the wrong browser content, so who cares? If someone's spoofing the UA, they likely already know what they're getting themselves into.
  • Daniel Petrovaliev
    Daniel Petrovaliev over 8 years
    This regex does not recognize facebook in-app browser.
  • D4V1D
    D4V1D over 8 years
    Why using a function to store the condition instead of a simple variable and do if($isMobile) {}?
  • Ivijan Stefan Stipić
    Ivijan Stefan Stipić over 8 years
    Here is updated version: return preg_match("/(android|webos|avantgo|iphone|ipad|ipod|blackbe‌​rry|iemobile|bolt|bo‌​ost|cricket|docomo|f‌​one|hiptop|mini|oper‌​a mini|kitkat|mobi|palm|phone|pie|tablet|up\.browser|up\.link|‌​webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]); This is collection of few new devices.
  • lajeesh k
    lajeesh k about 8 years
    this script will not detect ipad . please change ip(hone|od) to ip(hone|ad)
  • Tschallacka
    Tschallacka about 8 years
    that software is annoying. no support for IIS, no php only library.
  • DevZer0
    DevZer0 about 8 years
    this answer is now so obsolete. there are many false positives, safari on OSX is detected as a mobile, Chrome on OSX detected as Mobile.
  • Naveed
    Naveed almost 8 years
    @DevZer0: Ok. You can add latest solution in the end of this answer.
  • bobble bubble
    bobble bubble almost 8 years
  • kmoney12
    kmoney12 over 7 years
    What is the substr($useragent,0,4) part for?
  • AHB
    AHB over 7 years
    Seeing this awesome post, there is no file in my host but PHP ones! PHP is excellent.
  • BeRocket
    BeRocket almost 7 years
    Not working for me while Justin DoCanto's way is working ok. Probably outdated answer
  • Roelof Berkepeis
    Roelof Berkepeis almost 7 years
    This works ! And this simple script seems one of the best i found : (until now) it's the only script i found which can detect my ASUS ZenPad tablet ! But NOTE : they changed the $url to https://useragentinfo.co/device, see their page https://useragentinfo.co : it gives bash code to execute curl but indeed you can replace this by your PHP lines. However, you should omit the line "Authorization: Token .." because it seems no longer needed (and i see no way to get that API key).
  • Mohd Bashir
    Mohd Bashir almost 7 years
    Not getting response. just showing {} I think API token is needed can you please guide me how to generate the token.
  • Mohd Bashir
    Mohd Bashir almost 7 years
    $data = array('user_agent' => $useragent); It should be as : $data = array('useragent' => $useragent);
  • BurninLeo
    BurninLeo about 6 years
    The answer is from 2010 and the most recent update on the referenced page is from 2014. Therefore I would not recommend using this solution, any more.
  • Abhay
    Abhay over 5 years
    too old solution
  • Naveed
    Naveed over 5 years
    @AbhayGawade: Too old question and answer as well
  • Umair Ayub
    Umair Ayub over 5 years
    @datasn.io YES OF COURSE, I do data scraping and you can fake any user-agent :)
  • Umair Ayub
    Umair Ayub over 5 years
    tested on iPhone Chrome version, and following user-agent was sent by client and it DIDNT detect as mobile Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/70.0.3538.75 Mobile/15E148 Safari/605.1
  • ENSATE
    ENSATE about 5 years
    What if the domain is not reachable?
  • Admin
    Admin almost 5 years
    When I echo its output, i get 0. Why is that?
  • Goran Usljebrka
    Goran Usljebrka almost 4 years
    This is a way old solution and it needs to be downvoted or replaced.
  • 吳約南
    吳約南 over 3 years
    Well, not working for me. I don't know why it got such lot vote up.
  • Boris Gafurov
    Boris Gafurov over 3 years
    Right you were 11 years ago, user agents are getting useless, e.g. they do not report Safari and Firefox iPad as mobile anymore. Chrome still does, but it will follow the suit soon, I guess.
  • Naveed
    Naveed about 3 years
    @吳約南 It is 10 years old answer. I think you should ask a new question. You can share the latest solution here instead of downvoting.
  • shaedrich
    shaedrich about 3 years
    While reading the documentation it occurs to me that this function is more or less just a wrapper to the user agent header which returns it parsed as an array. Am I wrong?
  • Intracta
    Intracta about 3 years
    It provides a lot more data vs the user agenda header as long as your server admin has browscap.ini. It can inform you what the browser supports and is a lot easier than having to put in all the regex people are writing.
  • shaedrich
    shaedrich about 3 years
    It's shorter — no doubt about that. I just noticed that they are based on the same data more or less.
  • marble
    marble almost 3 years
    @Naveed agreed. do you have it? (it wont work on Inspect mode for example)
  • marble
    marble almost 3 years
    @showdev it does not detect desktop chrome "Inspect" mode (Instead, it thinks its a mobile)
  • user3495363
    user3495363 almost 3 years
    does not work since it recognizes the desktop chrome Inspect mode as mobile
  • user3495363
    user3495363 almost 3 years
    domain no longer available. Is there a new one?
  • user3495363
    user3495363 almost 3 years
    but it will recognize Desktop Chrome on Inspect mode as mobile (though its a nice concept)
  • HardlyNoticeable
    HardlyNoticeable over 2 years
    @shaedrich Using the built-in function also has the advantage of being updated as new mobile devices (and new versions of user agent strings) are released.
  • Exception
    Exception over 2 years
    for me, it will not working when I open webpage in mobileview in chrome. Rather $_SERVER['HTTP_USER_AGENT']; is working as intended
  • user3495363
    user3495363 over 2 years
    @showdev did you solve this issue somehow by now?
  • stuartb
    stuartb almost 2 years
    @kmoney12 That's for getting just the first 4 characters of the user agent string. The rest of the string is not needed.