Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 9 Networking
  gp 9.1 Net_IPv4
  gp 9.2 Net_IPv6
  gp 9.3 Net_FTP
  gp 9.4 Net_POP3
  gp 9.5 Net_SMTP
  gp 9.6 Net_CheckIP
  gp 9.7 Net_IDNA
  gp 9.8 Net_Curl
  gp 9.9 Net_Socket
  gp 9.10 Net_UserAgent_Detect


Rheinwerk Computing

9.10 Net_UserAgent_Detect  toptop


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&uuml;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.
Tabelle 9.4 Features, die geprüft werden können
Feature Rückgabewert
'javascript' Version der JavaScript-Variante (1.3, 1.4 etc.), die unterstützt wird, oder false
'dhtml' true oder false, abhängig davon, ob der Browser DHTML unterstützt
'dom' Gibt true zurück, wenn der Browser DOM (Document Object Model) unterstützt, sonst false
'sidebar' Der Rückgabewert ist true, wenn eine Sidebar eingeschaltet ist, und sonst false11 
'gecko' Nutzt der Browser keine Gecko-Rendering-Engine, ist der Rückgabewert false. Handelt es sich um einen Browser, der auf Gecko basiert (Mozilla, Netscape, Firefox etc.), wird das Veröffentlichungsdatum der Gecko-Version zurückgegeben. Hierbei handelt es sich um einen String, der aus Jahr, Monat und Tag besteht, wie etwa '20050317'.

]
$js = Net_UserAgent_Detect::getFeature('javascript'); 
if (false != $js) 
{ 
   echo "Unterst&uuml;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.

 <<   zurück
     
  Zum Katalog
Zum Katalog: PHP PEAR
PHP PEAR
Jetzt bestellen!
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Katalog: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Katalog: Responsive Webdesign






 Responsive Webdesign


Zum Katalog: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Katalog: MySQL 5.6






 MySQL 5.6


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de