Nie ma reguł dla ciągów User-Agent, więc nie ma możliwości stworzenia całkowicie poprawnego i przyszłościowego parsera. Istnieje jednak ogólny wzór:
User-Agent: <engine-string> <engine-string> ...
Gdzie engine-string
ma formę:
<agent-name> (<comment>; <comment>; ...)
Każdy ciąg silnika (ja właśnie tak go nazwałem z mojego zrozumienia, co może być niepoprawne) może mieć komentarze lub nie.
Na przykład:
Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) ↲
AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e ↲
Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
(To jest pojedynczy ciąg, po prostu podzieliłem go na wiersze.) Wygląda na to, że za każdym razem, gdy ktoś robi rozwidlenie silnika przeglądarki, po prostu dołącza swoją rzecz na końcu. Mamy więc jakąś abstrakcyjną przeglądarkę „Mozilla” (dziedzictwo „Pierwszej wojny przeglądarek”), która myśli, że jest na iPhonie. Następnie widzimy, że istnieje WebKit (który pamięta, że narodził się jako KHTML jakiś czas temu). Jest też pewna modyfikacja w wersji 6.0, która została następnie zmodyfikowana do wersji Mobile/10A5376e, która stała się Safari/8536.25, która w końcu ujawnia tajemnicę, że jest to w rzeczywistości mobilny bot Google.
Inny przykład:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; ↲
InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; ↲
.NET CLR 3.5.30729; .NET CLR 1.1.4322)
To jest pojedynczy silnik, ale ma wiele do powiedzenia w nawiasach.
Ogólna obserwacja jest następująca:
- ostatnie ciągi silnika są najważniejsze,
- ostatnie komentarze w nawiasach są mniej ważne.
Mając to na uwadze, moim pomysłem byłoby przeanalizowanie ciągu do tych tokenów silnika i komentarzy, a następnie z każdej sekcji silnika wyrzucić komentarze, zaczynając, powiedzmy, od piątego. Następnie, jeśli to wciąż nie wystarczy, wyrzuć sekcje silnika zaczynając od drugiej (pierwsza to często abstrakcyjna „Mozilla”, ale często zawiera przydatne komentarze; czasami jest to również coś konkretnego, szczególnie dla robotów internetowych).
Podczas parsowania musimy wziąć pod uwagę, że czasami mogą pojawić się ciągi niezgodne z tym formatem. Można je zapisać w pliku dziennika w celu późniejszej kontroli, a następnie po prostu przyciąć do wymaganej długości, aby pasowały do bazy danych.