User_Agent auswerten
Sven
- php
1 Marc Reichelt0 Sven
Hallo ihr,
in einem Umfrage-Formular habe ich zu Statistikzwecken den User-Agent mit erfasst. Dabei kommt dann zum Beispiel sowas raus:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; Media Center PC 3.1; .NET CLR 1.1.4322)
Also, das MSIE 6.0 sagt mir zum Beispiel, dass er den Internet Explorer 6 verwendet ... um es optisch etwas klarer zu machen, würde ich das gern auch so ausgeben.
Ebenso mit dem Windows NT 5.1 - da wäre es schöner, wenn er "Windows XP" ausgeben würde, und so weiter...
Wie kann ich das am besten machen? Oder gibt es sogar vorgefertigte Möglichkeiten?
Danke!
Hallo Sven,
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; Media Center PC 3.1; .NET CLR 1.1.4322)
Erst mal musst du dir darüber im Klaren sein, dass dieser String gefälscht werden kann (und oft auch wird).
Wenn du das akzeptiert hast kannst du dich dran machen, den String mit bestimmten PHP-Funktionen zu parsen.
Z.B. kann man (falls irgendwelche Klammern drin sind) den Wert innerhalb dieser Klammern auslesen, danach erhältst du erst mal diesen String:
---schnipp---
compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; Media Center PC 3.1; .NET CLR 1.1.4322
---schnapp---
Nun kannst du diesen String anhand der ";"-Zeichen und der PHP-Funktion explode() in ein Array von einzelnen Werten zerlegen.
Danach entfernst du die Whitespace-Zeichen am Anfang und Ende jedes dieser Elemente mit der PHP-Funktion trim().
Die erhaltenen Werte kannst du dann entsprechend von PHP interpretieren lassen, da ist es auch kein Problem mehr aus "Windows NT 5.1" ein "Windows XP" zu machen - leider muss man hier viele Werte einzeln abfangen...
Das Ganze ist generell ein sehr schweres Vorhaben, ich wünsche dir auf jeden Fall viel Glück dabei!
Marc Reichelt || http://www.marcreichelt.de/
Alles klar, besten Dank schonmal... da stellt sich mir nur noch eine Frage:
Z.B. kann man (falls irgendwelche Klammern drin sind) den Wert innerhalb dieser Klammern auslesen, danach erhältst du erst mal diesen String:
---schnipp---
compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; Media Center PC 3.1; .NET CLR 1.1.4322
---schnapp---
Wie liest man den Wert innerhalb der Klammern aus? Gibts dafür einen PHP-Befehl?
Grüße
Sven
Hallo Sven,
Wie liest man den Wert innerhalb der Klammern aus? Gibts dafür einen PHP-Befehl?
Da wirst du wohl nicht um die "regular expressions" drumrumkommen.
Hier ist aber schon mal der Befehl den du suchst: preg_match()
Am 3. Beispiel (das ziemlich komplex aussieht) kann man sehen wie du einen Text zwischen zwei Ausdrücken herausfindest...
Bis dann!
Marc Reichelt || http://www.marcreichelt.de/
Hallo, Marc!
Da wirst du wohl nicht um die "regular expressions" drumrumkommen.
strpos und substr tuhen es auch.
regex sind unnötig.
freundl. Grüsse aus Berlin, Raik
Hallo Sven,
Da wirst du wohl nicht um die "regular expressions" drumrumkommen.
strpos und substr tuhen es auch.
regex sind unnötig.
da kann ich Raik nur beipflichten. M. E. sollte man um jeden Preis nach anderen Lösungen suchen, Reguläre Ausdrücke sind nicht einfach zu handhaben, was eine Anpassung erschweren kann, und werden vergleichsweise langsam interpretiert.
Marc hatte es schon angesprochen, das der USER_AGENT nicht mehr als eine Zeichenkette ist, die verändert werden kann. Aus dieser Überlegung heraus stellt sich daher natürlich die generelle Frage: Macht es dann Sinn? Webalizer, (das vermutlich bekannteste Logdatenauswertungstool) beispielsweise analysiert den USER_AGENT; aber die Frage mußt Du Dir selbst beantworten.
Aufbau des String "USER_AGENT":
$string =$string_produkt.$string_erweiterung;
$string_produkt =$string_gruppe.$string_version;
$string_erweiterung=$string_kommentar.$string_anhang;
Ein Beispiel:
Opera/7.54 (Windows NT 5.1; U) [de]
^ ^
produkt , erweiterung
Anzumerken ist, daß nicht alle USER_AGENTs einen Anhang mitliefern. Man darf als stillschweigenden Standard annehmen, daß
- $strin_produkt keine Leerzeichen enthält,
- $strin_produkt sich immer von $string_erweiterung durch ein Leerzeichen abtrennt
Jedoch sollte man sich dessen nie sichersein und wie in jedem Programm abprüfen, ab die zur Programmierungszeit umgestzten Annahmen auch eingetreten sind. Dies werde ich nicht extra machen.
$a=explode(' ',$string,2);
$string_produkt =$a[0];
$string_erweiterung=$a[1];
Man darf als stillschweigenden Standard annehmen, daß
- $string_gruppe sich immer von $string_version durch ein Leerzeichen abtrennt
$b=explode('/',$string_produkt,2);
$string_gruppe =$b[0];
$string_version=$b[1];
Man darf als stillschweigenden Standard annehmen, daß
- $string_kommentar immer in Klammern (chr(40).$string_kommentar.chr(41)) steht
- $string_kommentar keine Klammern enthält
$c=explode(')',str_replace('(','',$string_erweiterung),2);
$string_kommentar=$c[0];
$string_anhang =trim($c[1]);
Man darf als stillschweigenden Standard annehmen, daß
- $string_kommentar sich durch semikolongetrennte Substrings unterteilt
$string_kommentar=explode(';',$string_kommentar);
Welche Möglichkeiten es gibt, kannst Du auf zwei wegen herausfinden:
1. Spezifikationen aller Clientsoftware studieren
2. Logdaten auswerten und Übereinstimmungen zusammenfassen
Gruß aus Berlin!
eddi