Browsererkennung, bitte um erkärung

Hi…

Ich wollte mal einen Script schreiben, wo PHP überprüfen soll, welchen Browser man benutzt…
Das mit HTTP_USER_AGENT kenne ich ja und muss ich ja auch verwenden, da ich nciht genau wusste wie ich das jetzt am Sinnvollsten verwende habe ich gegoogelt und bin auf den script gestoßen

[PHP]

<?php function get_browser_($user_agent) { $browsers = array( 'Opera' => 'Opera', 'Mozilla Firefox'=> '(Firebird)|(Firefox)', 'Galeon' => 'Galeon', 'Mozilla'=>'Gecko', 'MyIE'=>'MyIE', 'Lynx' => 'Lynx', 'Netscape' => '(Mozilla/4\.75)|(Netscape6)|(Mozilla/4\.08)|(Mozilla/4\.5)|(Mozilla/4\.6)|(Mozilla/4\.79)', 'Konqueror'=>'Konqueror', 'SearchBot' => '(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp/cat)|(msnbot)|(ia_archiver)', 'Internet Explorer 6' => '(MSIE 6\.[0-9]+)', 'Internet Explorer 5' => '(MSIE 5\.[0-9]+)', 'Internet Explorer 4' => '(MSIE 4\.[0-9]+)', ); foreach($browsers as $browser=>$pattern) { if (eregi($pattern, $user_agent)) return $browser; } return 'Unknown'; } $user_agent = $_SERVER['HTTP_USER_AGENT']; echo get_browser_($user_agent); ?>

[/PHP]

Soweit ist es ja auch eigendlich ganz logisch. Erst ist da ja die funktion get_browser und die wird aufgerufen… allerdings verstehe ich nicht ganz, was das hier alles soll…

.[0-9]+
/4.08

Oder wieso die Namen abundzu in klammern stehen

(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp/cat)

kann mir das bitte jemand erklären??

mfg RaZ0oR

Die Funktion eregi() benutzt zum Suchen nach einer Zeichenkette in einer weiteren sogenannte Reguläre Ausdrücke.
Das Thema ist relativ komplex, aber hier kann man sich ein wenig informieren.

Gruß
Voodoo

Okay, ich hab jetzt mal kurz die ersten 2-3 Absätze gelesen…
Braucht man dann Unbedingt die RegExp bei dem vorhaben was ich machen will?

Uih… reguläre Ausdrücke, ein Thema das ich gar nicht mag :smiley:

Fangen wir mal mit dem einfachsten an, die Geschichte mit den normalen Klammern. Das sind bei den Suchmaschinen z.B. ganz einfache Alternativen, auf gut deutsch: Guck einfach mal, ob da irgendein Ausdruck passt.

.[0-9]+

Das ist auch noch ziemlich einfach, soviel ich weiß. Der Punkt wird mit dem \ maskiert (sagt man glaub ich so, oder doch escaped) damit der Punkt auch wirklich als Punkt im Suchausdruck gewertet wird. [0-9] heißt dass dann eine Ziffer von 0-9 kommen muss und das Plus am Ende ist der sogenannte Quantifizierer, das heißt dass die Ziffern 0-9 mindestens 1mal vorkommen muss und n-mal vorkommen kann.

/4.08

Und das ist eigentlich auch wieder einfach, hoffe ich. Das /4 ist einfach Teil des Suchstrings, z.B. Mozilla/4 dann wieder das . der Punkt wird escaped, d.h. dass der Punkt auch im Ausdruck sein muss und am Schluss muss die 08 auch noch im Ausdruck sein.

Boah… ich hoffe ich hab mich halbwegs verständlich ausgedrückt, ansonsten guckst Du einfach mal hier: Reguläre Ausdrücke PHP Script resource Tutorials, Workshops und Artikel

Gruß thuemmy

Okay, soweit verstanden.
D.H.
hier

MSIE 4.[0-9]+

schaut es einfach ob es eine Version von MSIE ist, also z.B. 4.35

Werd mir dann noch mal beide Links anschaun.
Aber genau genommen brauche ich das ja dann nicht oder?
Wenn durch HTTP_USER_AGENT was mit MSIE 6.0 rauskommt und eregi das entdeckt ist es der IE 6.0 und wenn da Mozilla vorkommt, is es FF.

EDIT:
Das unter dem edit hat sich erledigt… habs einfach mal getestet

Bzw. wie überprüft den eregi.
Wenn jetzt mein HTTP_USER_AGENT rigendwas mit MSIE 6.0 rauskommt, reicht es wenn ich es dann
[PHP]eregi(‚MSIE 6‘,$user_agent);[/PHP]
so überprüfe? Dann müsste ja als ergebnis auch True rauskommen da ja MSIE 6 enthalten ist. Oder wird es nur true wenn es MSIE 6.0 heißt?

Wie gesagt, mit regulären Ausrücken tue ich mich auch schwer, aber soviel ich weiß, muss der komplette Inhalt in $user_agent abgeprüft werden.

Gruß thuemmy

Ja, allerdings muss der Ausdruck nur auf einen Teil der Zeichenkette „matchen“.
Beispiel:

preg_match("#(\n{1})#","04523"); // => TRUE

Das {1} erlaubt ja nur eine Ziffer. Allerdings matcht der Ausdruck dann sozusagen auf alle Ziffern nacheinander.
Du gibst also einfach den ganzen HTTP_USER_AGENT - String mit.

Gruß
Voodoo

Verstehe ich nicht…
Die ganzen dinge wie {1}, # sind doch bestimmt wieder regexp oder? mhhm muss ich mir wohl demnächst doch mal durchlesen… aber ich versteh trotzdem nicht wieso das true ist, er überprüft ja nur ob ein zeilenumbruch „\n“ drinne ist oder?

Wie Voodoo es bereits gemacht hat empfehle ich dir noch preg_match zu verwenden, da es schneller ist als ereg/i

Okay, ich stell das dann noch um, thx.
Aber wenn wir jetzt eh schon bei RegExp sind, mach ich jetzt kein neues Thema auf…

Ich wollte jetzt noch HTTP_USER_AGENT überprüfen, ob ein „de“ vorkommt.
Da ich ja nicht möchte, dass in irgendeinem wort auch de vorkommt, braucht man ja die RegExp wieder.
Daher habe ich mir mal thuemmy link durchgelesen…
das es jetzt überprüft ob nur ein de vorkommt, dachte ich mir jetzt, ich muss ja einfach schauen, dass es mit einem

^d

anfängt und mit einem

e$

aufhört.

daher habe ich das mal so geschrieben.

<?php echo $user = $_SERVER['HTTP_USER_AGENT']; echo preg_match("/^de$/i",$user); ?>

Meine Ausgabe von HTTP_USER_AGENT sieht so aus

Opera/9.50 (Windows NT 5.1; U; de)

Leider klappt das aber nicht so wie ich will, es gibt immer 0 (für false?) zurück

Naja, ist ja auch relativ logisch.
Du hast es selbst gesagt: Es müsste mit d anfangen und mit e aufhören. Damit wäre der einzige String der passt „de“.
So geht es also nicht.
Du kannst aber mittels \b die Wortgrenze bestimmen.

preg_match(„#\bde\b#i“,$_SERVER[‚HTTP_ACCEPT_LANGUAGE‘]);

Ich würde übrigens diese Server-Variable verwenden, weil in HTTP_USER_AGENT nur die Sprache des Betriebssystems mitgegeben wird und nicht die, die im Browser eingestellt ist.

Gruß
Voodoo

Ok thx, was du jetzt in preg_match benutzt sind auch RegExp oder?
Wenn ich bei mir in Opera die sprache umstelle, z.B: in englisch, dann ändert es beim aufruf von USER_AGENT das de in en

Wenn du ACCEPT_LANGUAGE verwendest kannst du genau so gut Stringfunktionen verwenden:
[php]substr($_SERVER[‚HTTP_ACCEPT_LANGUAGE‘], 0, 2) == ‚de‘[/php]
Oder, wenn’s irgendwo vorkommen kann, eben mit strpos.

…mit strpos gehts auch immer:
[PHP]
//Am anfang:
strpos($text, $suche) === 0

//irgendwo
strpos($text, $suche) !== false
[/PHP]

Is wahr. Da hatte ich gerade den eigentlichen Sinn von strpos vergessen :wink:

Da is es ja eig dcoh egal oder?
[LEFT]$_SERVER[‚HTTP_ACCEPT_LANGUAGE‘][/LEFT]
gibt doch nur „de“ oder „en“ o. ä. an?
dann kann ich ja genauso[php] if(„de“ == $_SERVER[‚HTTP_ACCEPT_LANGUAGE‘])
[/php]
machen

Nein, da stehen mehrere drin - nach Präferenz sortiert.

de-de,de;q=0.8,en-us;q=0.5,en;q=0.3Zum Beispiel.

achso, dann muss ich nochma schaun wie ich das ganze jetzt mache…

Äh, die Einträge werden natürlich durch Kommata getrennt. Durch Semikola wird dahinter die Präferenz angegeben. Hab den Beitrag nochmal editiert.