Identifikace mobilních prohlížečů
Úvod do problému
Při úpravách stránek můžete mít potřebu rozlišovat, zda se na Vaše stránky náhodou někdo nedívá z mobilního telefonu. Některé mobilní telefony totiž podporují prohlížení (X)HTML stránek a dokonce i s podporou kaskádových stylů (CSS), ale tato podpora je hodně špatná. Proto se může hodit možnost pro mobilní telefony poslat jinou nebo žádnou definici CSS.
Řešení problému
Provedl jsem menší výzkum toho, jak se mobily stránkám identifikují a dospěl jsem k závěru, že porovnáním určitých řetězců se dá se skoro stoprocentní jistotou (přibližně 98,2%) rozpoznat, zda se jedná o mobil či nikoliv.
Vytvořil jsem funkci IsMobile, která v případě prohlížení stránek mobilním telefonem vrací hodnotu True. V opačném případě vrací hodnotu False.
Původní vzhled funkce
Vzhledem k tomu, že moje znalost PHP je na úrovni začátečníka, navrhl jsem nejdříve funkci následovně.
<?php
function IsMobile()
{
// definice konstanty řetězce pro porovnávání
define("StrMob", "UP.LINK|MIDP|UP.BROWSER|NOKIA|MOT|SEC-".
"|WAP|ERICSSON|SAMSUNG|SIE-|PHONE|PANASONIC".
"|MITSU|LG|PORTALMMM|BLACKBERRY|SYMBIAN|PHILIPS".
"|SENDO|KLONDIKE|SAGEM|MOBILE|ALCATEL|SONY");
// návratová hodnota (výchozí je False)
$ret = False;
// rozdělí řetězec do pole
$mArr = explode("|", StrMob);
// identifikace prohlížeče
$Agent = StrToUpper($_SERVER["HTTP_USER_AGENT"]);
//prochází se všechny prvky pole
while (List($index, $hodnota) = Each($mArr))
// zjišťuje se výskyt prvku v řetězci identifikace prohlížeče
if (StrPos($Agent, $hodnota))
{
// pokud se vyskytuje, nastaví se návratová hodnota
$ret = True;
// a ukončí se procházení pole
break;
};
// vrácení návratové hodnoty
return $ret;
};
?>
Nový vzhled funkce
Byl jsem upozorněn na to, že by se to dalo dělat jednodušeji pomocí regulárních výrazů a proto jsem se pokusil o nich něco málo nastudovat (jen velmi hrubý základ) a původní kód jsem upravil do následující podoby.
<?php
function IsMobile()
{
// funkcí ERegI zjistím výskyt některé části řídícího řetězce
// v řetězci identifikace prohlížeče
$ret = ERegI(QuoteMeta("UP.LINK|MIDP|UP.BROWSER|WINDOWS PHONE|ANDROID|APPLEWEBKIT".
"|NOKIA|MOT|SEC-|WAP|ERICSSON|SAMSUNG|SIE-|PHONE".
"|PANASONIC|MITSU|LG|PORTALMMM|BLACKBERRY|SYMBIAN|PHILIPS".
"|SENDO|KLONDIKE|SAGEM|MOBILE|ALCATEL|SONY"),
$_SERVER["HTTP_USER_AGENT"]);
// vrácení návratové hodnoty
return $ret;
};
?>
Jak jsem dospěl k výsledkům?
Nejdříve jsem měl k dispozici vzorek jen čtyř telefonů, což bylo strašně málo. Dušan Janovský (Yuhů) mi poskytl seznam 86 identifikací mobilních prohlížečů z LOGu jeho webu, což bylo stále ještě málo, ale už se z toho dalo něco usuzovat. Kontak na Yuhůa zařídil Martin Jersák (JersyWoo), kterému tímto moc děkuji za spolupráci. Rovněž musím poděkovat i Dušanovi za poskytnutí výpisu z LOGu.
Vzhledem k tomu, že způsob získávání identifikačních řetězců se mi zdál nedostatečný (zdlouhavý postup a malá pravděpodobnost získání většího počtu zájemců o účast), napadlo mě, že bych se po identifikacích mobilních prohlížečů mohl poohlédnout na internetu. Podařilo se mi najít vzorek (konkrétně na http://www.postfile.com/downloads/_external/agents.php - bohužel již bylo odstraněno), který (po odstranění různého smetí) obsahoval 5102 záznamů a ten se mi zdál již dostatečně velký na to, aby se s ním dalo pracovat.
Analýzou tohoto seznamu jsem sestavil nejčastěji se vyskytující řetězce, které jednoznačně identifikovaly mobilní prohlížeče a sestavil jsem je podle četnosti jejich výskytu do řídícího řetězce, který jsem pak použil v regulárním výrazu ve výše uvedené funkci.
Výsledek
Pro otestování funkčnosti si můžete zobrazit stránku http://www.bobocop.cz/mobil-test.php nejdříve ve Vašem prohlížeči na počítači a poté na Vašem mobilním telefonu.
Pri zobrazení na počítači by měla stránka vypadat jako většina stránek na tomto serveru (styly, reklamy, vyhledávání), kdežto při zobrazení v mobilním telefonu bude bez stylů, reklam a bez vyhledávání.
Budete-li chtít kód použít, můžete si jej stáhnout ve verzi pro PHP (soubor ismobile_php.zip) nebo ve verzi pro ASP (soubor ismobile_asp.zip).