In order to determine whether to serve the mobile or full version of my site by default, I use a service that examines requests to determine the type of device they originated from. However, calls to that service are somewhat expensive, so I'd like to filter out a number of desktop clients before having to call my service.

My current traffic stats show the following breakdown for my site:

  • 35% - Chrome
  • 25% - IE
  • 20% - Firefox
  • 16% - Safari

I don't know what percentage of these are desktop browsers vs. mobile browsers. However, last month (before the mobile version of my site existed), mobile users accounted for about 10% of my traffic.

Here's my question: Are there some regular expressions I can apply to the user agent to identify much of my non-mobile traffic so I can avoid unnecessary service calls? It isn't critical that I catch all desktop browsers at this stage. Even identifying 50% of them would be a huge help. It is important, however, not to incorrectly identify a mobile browser as a desktop one. Thus, conservatism would be a benefit here.


I want to unambiguously identify some of the common desktop browsers as desktop, but the info I've been able to find so far has been outdated (the bane of browser detection) or otherwise unhelpful.

Here's an example: Chrome is available both on the desktop and on cell phones. Can I write a regular expression to look at a Chrome user agent string and say definitively that it isn't a cell phone? If it makes things simpler, I'm currently treating tablets as desktop browsers, though if it's too complicated, I don't need to handle them here.

  • Tried Google Analytics?
    – elssar
    Feb 13, 2013 at 6:36
  • @elssar: Sure, my statistics come from there. However, I don't know how to convert those statistics into browser detection code. Feb 13, 2013 at 11:38

3 Answers 3


I don't exactly understand what you need, but if you just want the numbers, then you can get them at Google Analytics -

Google Analytics Browser+ OS

In the menu on the left, in the Audience --> Technology --> Browser & OS. Then select OS as the secondary dimension.

But if you want real time data, or need to send data to the expensive service, then a regular expression on the user-agent string is a good way to go about it, just change it to search for desktop user-agent patterns. You can find a list of common user-agents and their OS-Browser combinations here.

Also, you can export your GA data to CSV or some other format and then pass it to the other service, if that is possible.

There are a bunch of user-agent string parsers available for download on user-agent-string.info, and it also has an api. Plus a very comprehensive list of UA strings.

Gotta love Google :)

  • Thanks for the list of user agents. However, it's years old, only tangentially related, and doesn't do anything to help solve my problem. My question isn't about the numbers; they were only background. That should be clear since I introduced my question with the bolded statement, "Here's my question." Feb 14, 2013 at 0:41
  • @ScottSeverance that was what you asked, but it might be that what you need can be accomplished in some other way. Two different things.
    – elssar
    Feb 14, 2013 at 0:49

Detecting based off User Agent is, and always will be, an inexact science. I think a much better option would be to detect the width of their device, and then decide which one to send them to. Something like

 if ($(window).width < 600) {

Could do what you need.

  • Thanks for the comment. However, since I'm trying to determine which site version to serve Javascript is not a very good approach. I need to determine the appropriate version before I serve the page. If I use Javascript, I have to load a page, then detect, then redirect. That would waste time and bandwidth, and just seems silly. The detection needs to be on the server side. Apr 16, 2013 at 1:47

The site http://detectmobilebrowsers.com/ suggests using two regular expressions and some substrings. They make the code available in some sixteen programming languages. Here is what they recommend in JavaScript.

(function(a,b){if(/(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.test(a)||/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.test(a.substr(0,4)))window.location=b})(navigator.userAgent||navigator.vendor||window.opera,'http://detectmobilebrowser.com/mobile');
  • Thanks. However, this is detecting mobile browsers, which is a moving target, and only 10% of my traffic. I want to detect desktop browsers. Simply negating the regex you give wouldn't work because it is presumably incomplete, or at least would be incomplete as time passes. It would result in some number of mobile browsers falsely being identified as desktop browsers. Feb 13, 2013 at 11:36
  • I think that will be difficult. The problem is that new browsers usually pretend to be whatever browser is the most popular with some small change to differentiate. Its the same for the new mobile browsers. Mobile safari pretends to be almost like safari, etc. Feb 13, 2013 at 17:08

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.