2
\$\begingroup\$

I've been using the following user agent Regular Expression to detect mobile devices, but I recently came across a few resources that listed a whole host of mobile user agents that I had not heard of before.

Whilst my agent check is only the first step in the detection process - I also have some JavaScript as a fallback - I would like for it to contain the majority of currently undisputed mobile "keywords" so as to optimise the user experience for those handsets. I would also like to keep things as future-proof as possible, but this can only ever be argued with good reasoning and not set-in-stone.

The core of the regexp follows - please note the user agent string has had it's white-space removed. The check is also specifically case dependent.

Please ignore the newlines; they are for formatting only.

/i[Pp]hone|[Mm]obile[Ss]afari|[Ww]indowsCE|[Ww]indows[Pp]hone|
 IE[Mm]obile|[Oo]pera[Mm]ini|[Oo]pera[Mm]obi|[Bb]lack[Bb]erry|
 [^A-Z]RIM[^A-Z]|[Ss]ony[Ee]ricsson|[Nn]okia|[^A-Z]MIB[^A-Z]/

These are the extra edge-case agents that I've found out about:

/[Ss]kyfire|[Tt]ea[Ss]hark|[Nn]et[Ff]ront|[Mm]inimo|
 [Ii]ris|[Ff]ennec|[Dd]oris|[Ss]eries60|BOLT|[Bb]lazer/

Does anyone have any further suggestions, or possible keywords to remove, that could cause false positives?

For example, I do not include Samsung or Android for the precise reasons that they are not unique to mobile agents. I'd rather let agents through to the JavaScript that I'm unsure about.

As a second note, many user-agents report as Like Something - i.e. Like Mobile Safari - should I filter these out of the equation, or if something is reporting this; is it also likely to be a mobile device.

\$\endgroup\$
6
  • \$\begingroup\$ It is better to detect features than devices, for example using CSS media queries to cater for small screens, or jQuery UI Touch Punch to handle touch events. The most important question is WHY you want to detect a mobile user. What will you do differently for them? \$\endgroup\$
    – user16973
    Oct 25, 2012 at 2:29
  • \$\begingroup\$ Take a look at detectmobilebrowsers.com. You can download scripts in almost any language, including PHP, and take a look at the regex voodoo. Also be sure to provide a link to the non-mobile version so that the user can choose to go to the full site should they choose to do that or if the detection fails. \$\endgroup\$
    – user555
    Nov 6, 2012 at 0:38
  • \$\begingroup\$ +1 Thanks for the info, however their regex voodoo - whilst seemingly rather inclusive - is also rather cryptic. I would have a hard time justifying the reasons behind each particular check to the server team I'm working alongside. Although looking at the regexp has raised a good point because I have no idea what my client expects to happen with Kindle devices ;) \$\endgroup\$
    – Pebbl
    Nov 7, 2012 at 21:30
  • \$\begingroup\$ The site I linked uses the WURFL database. You can download the database, pick and choose which user agents you want to support. You will have to do all the regex voodoo yourself though. \$\endgroup\$
    – user555
    Nov 8, 2012 at 2:25
  • \$\begingroup\$ Yeah, I recently came across WURFL and also read about their new license preventing people from breaking it up and using it in an unlicensed way. Whilst I could probably do such a thing and not be found out, I don't agree with ignoring licenses and would rather develop my own solution. It is a useful link however to others who may find this. \$\endgroup\$
    – Pebbl
    Nov 8, 2012 at 9:22

1 Answer 1

2
+50
\$\begingroup\$

First of all I guess your first step of the detection process is processed server side because you said there is a fallback which is processed by JavaScript. Therefore I guess you only perform a HTTP User-Agent check so far.

Suggestion BlackBerry

I would recommend to add also a check of the Accept request header to your first step of detection.

In one of my recent projects I ran into trouble cause the HTTP User-Agent detection of BlackBerry failed in some cases. For these casees I had to add an Accept request header check which looks for /vnd.rim/. I didn't find out much about the background why it happens. I only know some BlackBerry browsers try to emulate IE or Firefox.

Example

Taken from the BlackBerry 8120 device specification document: application/vnd.rim.html

Suggestion J2ME Devices

Clients using this technology might be quite rare but to be sure you could include another RegEx for midp to cover all kind of MIDP devices.

Question

I know they're dead but I think there are still some around. What about Palm and webOS devices?

\$\endgroup\$
1
  • \$\begingroup\$ +1 Thanks for the good points, and pointing out that I had totally missed to state server side, my bad :) you are correct in your assumptions. I had not considered the Accept request header at all, I shall do some research... \$\endgroup\$
    – Pebbl
    Nov 7, 2012 at 21:35

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.