2012-06-23 8 views
5

Jeśli mam user-agent iOS jakWykrywanie iOS Numer wersji z User Agent przy użyciu wyrażeń regularnych

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 jak Mac OS X; en-us) AppleWebKit /532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7

lub

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X ; en-us) AppleWebKit/532,9 (KHTML, podobnie jak Gecko) Mobile/7D11

W jaki sposób wykryć wersję systemu iOS za pomocą wyrażeń regularnych, aby zwrócić ją np.

4,0

dla powyższego agenta użytkownika?

+1

jakim języku można byłoby wyodrębnianie go? –

+0

Koduję w PHP – user1477182

Odpowiedz

5

To wyrażenie regularne powinien robić to, co chcesz:

/iPhone OS (\d+)_(\d+)\s+/ 

trzeba uchwycić dwie wartości grupowych dopasowywania, jak to zrobić, zależy od używanego języka ...

PHP ty można to zrobić w ten sposób:

$txt = 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7'; 
$reg = '/iPhone OS (\d+)_(\d+)\s+/'; 
$a = array(); 
preg_match($reg, $txt, $a); 

$str_version = $a[1].'.'.$a[2]; // This variable should now contain : 4.0 
+0

Wielkie dzięki! Gdybym miał to zrobić w PHP, czy po prostu użyłbym powyższego wzorca w funkcji preg_match? – user1477182

+0

Tak, możesz z niego korzystać. Zobacz moją zaktualizowaną odpowiedź ... – aleroot

+0

Wielkie dzięki! :) – user1477182

9

regex, że pracuje dla mnie jest:

/OS ((\d+_?){2,3})\s/ 

iPada 5.1.1 ma HTTP_USER_AGENT takiego:

"Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3" 

So 3 numery w wersji iOS i nie iPhone OS obecnej.

Ewentualna realizacja Ruby mogą być:

def version_from_user_agent(user_agent) 
    version = user_agent.match(/OS ((\d+_?){2,3})\s/) 
    version = version[1].gsub("_",".") if version && version[1] 
end 

Zwraca nil jeśli nie wersja iOS znaleźć

3

To wyrażenie regularne dopasuje 2 i 3 segmenty jak 4.0 lub 6.1.3

/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/ 

JavaScript Przykład:

> navigator.userAgent 
    "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B146" 
> navigator.userAgent.match(/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/); 
    ["6_1_2"] 

Pamiętaj, że może się to równać z innymi urządzeniami, więc sprawdź to na urządzeniu z systemem iOS.

Spowoduje to wyświetlenie wersji systemu OS X na komputerze Mac.

> navigator.userAgent 
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/6.0.5 Safari/536.30.1" 
> navigator.userAgent.match(/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/); 
    ["10_8_4"] 

też może chcieć zastąpić _ przez . użyciu .replace(/_/g,'.'); lub nawet przekonwertować go na tablicy przy użyciu .split('_');.

_iOSDevice = !!navigator.platform.match(/iPhone|iPod|iPad/); 
if(_iOSDevice) 
_iOSVersion = (navigator.userAgent.match(/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/)||[''])[0].replace(/_/g,'.'); 
0

znalazłem istniejące odpowiedzi nie mają dobry wskaźnik sukcesu podczas testów przed możliwych ciągów agenta użytkownika na tej stronie ciągów agenta przykład użytkowniczki:

http://www.webapps-online.com/online-tools/user-agent-strings/dv/operatingsystem51849/ios

Mam utworzonego następujące wyrażenie, które ma większy sukces w przypadku testowania na podstawie poniższych przykładów:

(iPad|iPhone|iphone|iPod).*?(OS |os |OS\_)(\d+((_|\.)\d)?((_|\.)\d)?) 

Czwarta grupa zawiera wersję ios numer, który ma format x_y_z lub x.y.z, gdzie y i z są opcjonalne.

Istnieje 7 przykładów ciągów agenta użytkownika, które nie zawierają żadnego numeru wersji, więc te poszczególne nie są dopasowane. Jest jeden przykładowy ciąg, w którym wersja ios to "7.1", ale regex pasuje tylko do głównej wersji "7" (to było wystarczająco dobre dla mojego przypadku użycia).

Oprócz testów na powyższej stronie, jego również zostały przetestowane przed ciągów agenta ios10 wymienionych na tej stronie:

https://myip.ms/view/comp_browsers/1983/Safari_10.html

Powiązane problemy