9.10 Net_UserAgent_Detect 

Besprochene Version: 2.1.0 | Lizenz: PHP-Lizenz 2.02 |
Klassendatei(en): Net/UserAgent/Detect.php |
Das Paket Net_UserAgent_Detect ist sehr hilfreich, wenn Sie Ihre Programmierung an verschiedene User-Agents, sprich Browser, anpassen wollen. Möchten Sie selbst eine Routine mit PHP und/oder JavaScript erstellen, die die Browser, deren Versionen, das genutzte Betriebssystem und Ähnliches erkennt, so ist das ein sehr hoher Aufwand.
Net_UserAgent_Detect nimmt Ihnen diese Arbeit ab und stellt umfangreiche Informationen über den Client zur Verfügung. Da es eine recht große Anzahl an unterschiedlichen Rückgabewerten gibt, ist es teilweise recht aufwändig, diese zu prüfen.
Ein Wort der Warnung ist auch hier angebracht: Aufgrund der Tatsache, dass es sehr viele Browser auf dem Markt gibt und diese laufend aktualisiert werden, sollten Sie vor der Nutzung von Net_UserAgent_Detect prüfen, wann das Paket das letzte Mal aktualisiert wurde. In der Vergangenheit ist das Paket nicht immer regelmäßig aktualisiert worden.
Die wichtigste Unterscheidung bei der Erkennung eines Browsers ist sicher erstmal, ob es sich um einen Internet Explorer der Firma Microsoft oder um einen anderen Browser handelt. Um Ihnen diese Unterscheidung zu ermöglichen, ist die Methode isIE() definiert, die, wie alle anderen Methoden auch, statisch aufgerufen werden kann. Die Methode bestätigt mit einem true, dass es sich bei dem Client um einen Internet Explorer handelt, und liefert andernfalls ein false zurück.
if (true == Net_UserAgent_Detect::isIE()) { // Code fuer Internet Explorer } else { // Code fuer andere Browser }
Sie können diese grobe Unterscheidung auch noch etwas verfeinern. Die Methode isNetscape() prüft, ob es sich bei dem Browser um einen Netscape-Browser bzw. einen kompatiblen Browser wie Mozilla handelt. Im Gegensatz dazu gibt die Methode isNavigator() nur dann ein logisches Wahr zurück, wenn es sich bei dem Client wirklich um einen Browser der Firma Netscape handelt.
Möchten Sie noch feiner untergliedern, ist das auch kein Problem. Hierzu können Sie die Methoden getUserAgent() und getBrowserString() nutzen. getUserAgent() gibt Ihnen direkt den String zurück, mit dem sich der Browser identifiziert. Es handelt sich also beispielsweise um einen String wie
Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en- US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2
oder
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de- de) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312
Bei dem ersten String handelt es sich um die Identifikation eines Firefox-Browsers auf einem Apple Macintosh-Computer, der unter dem Betriebssystem OS X läuft. Der zweite String identifiziert einen Safari-Browser auf derselben Plattform.
Solche Strings sind zwar sehr aussagekräftig, aber die Auswertung ist recht aufwändig. Daher ist es sicher in den meisten Fällen sinnvoller, getUserAgent() zu nutzen. Diese Methode gibt Ihnen eine deutlich kürzere Versionsinformation zurück. Im ersten Fall gibt die Methode den String Firefox 1.x zurück und im zweiten Konqueror/Safari. Es werden also nur der Name des Browsers sowie die Hauptversionsnummer zurückgegeben. Die Hauptversionsnummer ist in den meisten Fällen ausreichend, da innerhalb einer Hauptversion die Unterschiede in der Verarbeitung meist nicht so groß sind.
Ein Microsoft Internet Explorer wird jeweils durch den String Microsoft Internet Explorer 6.x identifiziert, wobei die 6 natürlich durch die entsprechende Versionsnummer ersetzt wird. Sollte es sich um einen Internet Explorer handeln, bei dem die Versionsnummer nicht ermittelt werden kann oder der zu neu für das Paket ist, entfällt die Rückgabe der Versionsnummer.
Ein Netscape Browser der Version 4.x wird durch den String Netscape 4.x identifiziert. Bei einem Netscape Navigator wird genau dieser Text auch als String zurückgegeben, und ein Mozilla-Browser bzw. ein Netscape-Browser mit einer Version größer oder gleich 6 wird durch den Text Mozilla/Netscape 6.x bezeichnet. Zusätzlich können noch Opera-Browser erkannt werden, bei denen die Methode Opera und die Version des Browsers zurückgibt.
Das sind nur die wichtigsten und üblichsten Browser. Andere Browser wie Lynx oder Hotjava werden auch erkannt. Eine komplette Liste aller Browser finden Sie leider nur im Quelltext der Datei Detect.php.
Alternativ können Sie auch mit der Methode getBrowser() prüfen, ob der verwendete Browser in einer Liste enthalten ist, die Sie in einem Array an die Methode übergeben. Welchen Browser Sie erwarten, können Sie hierbei durch ein Flag definieren. Ein solches Flag besteht aus einer Abkürzung für den Browsernamen und kann zusätzlich noch eine Versionsnummer enthalten. So ist das Flag für den Internet Explorer beispielsweise ie. Um zu testen, ob es sich explizit um die Version 5 des Browsers handelt, lautet das Flag ie5, und wenn Sie feststellen wollen, ob die Version 5 oder größer ist, nutzen Sie ie5up als Flag. Sollte es bei einem Browser innerhalb eines Major-Releases relevante Unterschiede in einem Minor-Release gegeben haben, wie das zum Beispiel beim Schritt zum Internet Explorer 5.5 der Fall war, ist das auch abgedeckt. In diesem Fall lautet das Flag ie5_5.
$aktuelle=array ('ie6up', 'ns6up', 'firefox'); $browser = Net_UserAgent_Detect::getBrowser($aktuelle); if (false == $browser) { echo "Ihr Browser wird nicht unterstützt"; } else { if ('firefox' === $browser) { // Firefox-Code } else { // Code fuer IE 6 und NS 6 } }
Die Methode gibt das erste Flag aus der Liste zurück, das mit dem genutzten Browser übereinstimmt. Daher wäre es wenig sinnvoll, eine Liste wie diese zu nutzen: 'ns','ns5','ns6' – wohingegen 'ns5','ns6','ns' brauchbar ist. Bitte beachten Sie, dass die Methode null und nicht false zurückgibt, wenn der verwendete Browser nicht in der Liste enthalten ist. Vor diesem Hintergrund wurde in dem Beispiellisting ein Vergleichsoperator (==) und nicht der Identitätsoperator (===) genutzt.
Die Methode isBrowser() bekommt ein Flag übergeben und liefert ein true oder ein false zurück, um auf diesem Weg mitzuteilen, ob der Browser durch das Flag beschrieben wird.
Eine komplette Liste aller definierten Flags finden Sie im Quelltext des Pakets in der Methode detect().
Nachdem Sie nun Möglichkeiten kennen, um den Browsertyp und die -version herauszufinden, stellt sich noch die Frage, welche Features von dem Browser unterstützt werden. Eine Funktionalität wie JavaScript ist beispielsweise unter Umständen ausgeschaltet.
Der Methode getFeature() können Sie einen String übergeben, der ein Feature definiert. Ist dieses vorhanden, gibt die Methode entweder ein false zurück, wenn das Feature (zurzeit) von dem Browser nicht unterstützt wird. Wird das Feature unterstützt, gibt die Methode true oder die Version des Features zurück.
[Zurzeit liefert das Feature anscheinend immer false zurück.]
$js = Net_UserAgent_Detect::getFeature('javascript'); if (false != $js) { echo "Unterstützte JavaScript-Version: $js"; }
Alternativ steht auch die Methode hasFeature() zur Verfügung. Diese bekommt auch einen der Strings aus Tabelle 9.4 übergeben und gibt nur true oder false zurück.
Ein anderer interessanter Punkt ist die Frage, welche MIME-Types, Sprachen und Zeichensätze der Client akzeptiert, was Sie mit den Methoden getAcceptType() und hasAcceptType() testen können. Die erste Methode bekommt als ersten Parameter ein Array mit möglichen Werten übergeben und als zweiten die Information, welcher Typ abgefragt werden soll. Sie liefert dann den ersten Wert, den der Browser unterstützt, als Ergebnis zurück. hasAcceptType() bekommt als ersten Parameter nur einen möglichen Wert übergeben und als zweiten wiederum, um welche Art von Typ es sich handelt. Der Rückgabewert ist ein logisches Wahr, wenn der Typ vom Browser unterstützt wird, und sonst ein false.
Um zu testen, welche MIME-Types unterstützt werden, nutzen Sie als zweiten Parameter den String 'mimetype'. Als ersten Parameter übergeben Sie, abhängig von der Methode, entweder ein Array mit MIME-Types oder einen einzelnen MIME-Type:
$types= array('text/xml','text/html'); $mime=Net_UserAgent_Detect::getAcceptType($types,'mimetype')); echo $mime; // gibt den ersten unterstuetzten Typ aus if (true ==Net_UserAgent_Detect::hasAcceptType( 'text/xml','mimetype')) { echo 'Der Browser akzeptiert XML'; } echo { echo 'Der Browser mag kein XML'; }
Um die unterstützten Sprachen zu testen, übergeben Sie als zweiten Parameter den String 'language'. Der erste Parameter ist ein Array aus Sprachcodes bzw. ein einzelner Sprachcode. Die Sprachcodes setzen sich hierbei aus der eigentlichen Sprache und der Regionalisierung zusammen. Das heißt, 'de-de' steht für die deutsche Sprache und die Region Deutschland. 'de-at' steht für »österreichisches Deutsch«, 'en-en' für »englisches Englisch«, 'en-us' für amerikanisiertes Englisch und so weiter. Bitte beachten Sie bei der Nutzung von hasAcceptType(), dass ein Browser mehrere Sprachen unterstützen kann. Diese werden innerhalb des Browsers der Wichtigkeit nach sortiert. Somit kann es vorkommen, dass Sie mit hasAcceptType() feststellen, dass eine bestimmte Sprache unterstützt wird, obwohl sie die letzte in der Liste ist. Daher ist in diesem Zusammenhang die Nutzung von getAcceptTypes() unter Umständen sinnvoller.
Welche Zeichensätze vom Client unterstützt werden, können Sie herausfinden, indem Sie als zweiten Parameter 'charset' übergeben. Auch hier müssen an erster Stelle die Zeichensätze in üblicher Notation, also zum Beispiel als 'ISO-8859–1' oder 'UTF-8' übergeben werden.
Sehr interessant ist auch noch die Eigenschaft 'encoding'. Mit dieser können Sie prüfen, in welcher Kodierung Daten an den Browser geschickt werden können, das heißt, ob der Browser beispielsweise Daten akzeptiert, die im 'gzip'–, 'deflate'- oder 'compress'-Format vorliegen.
Ich möchte nicht unerwähnt lassen, dass das Paket auch Quirks von bestimmten Browsern zurückliefern kann. Bei Quirks handelt es sich um »Macken«, die ein Browser hat. Da diese Quirks aber nur anhand der Browser-Hersteller und -Versionen geprüft werden, können Sie diese Daten auch direkt als Grundlage zum Identifizieren eines Quirks nutzen.
Zusätzlich bietet das Paket aber auch Möglichkeiten, um das Betriebssystem des Clients zu erkennen. Am einfachsten ist hier sicher die Nutzung der Methode getOSString(). Sie liefert einen String zurück, der Ihnen mitteilt, um welches Betriebssystem es sich handelt. Mögliche Rückgabewerte sind hierbei 'Macintosh', 'Microsoft Windows XP', 'Microsoft Windows NT', 'Microsoft Windows 2000', 'Microsoft Windows Millenium', 'Microsoft Windows 9x', 'Microsoft Windows', 'Microsoft Windows 2003' oder 'Linux/Unix'.
Allerdings können Sie auch hier wieder anhand von vordefinierten Werten prüfen, ob das genutzte Betriebssystem einem System entspricht, das Sie erwarten. Übergeben Sie der Methode isOS() eines dieser Flags und entspricht das Betriebssystem diesem Flag, bestätigt die Methode das mit dem Wert true. Andernfalls liefert sie ein false. getOS() hingegen akzeptiert ein Array von Flags und gibt das erste Flag zurück, das auf das Betriebssystem zutrifft. Kann keine Übereinstimmung gefunden werden, ist null der Rückgabewert.
Ähnlich wie bei den Browsern ist die Liste der möglichen Flags recht lang und auch nicht dokumentiert. Sie finden sie im Quelltext des Paketes in der Methode detect(). Die wichtigsten Flags sind 'win', 'win95', 'win9x', 'win98', 'winme', 'win2k', 'winxp', 'winnt', 'win2003', 'mac', 'linux', 'unix', 'sun' und 'bsd'. Eine Unterscheidung zwischen Mac OS X und Mac OS 9 ist leider nicht vorgesehen.