2012-06-23 4 views
5

Wenn ich ein iOS-User-Agent wieDetecting iOS-Versionsnummer von User Agent mit regulären Ausdrücken

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

oder

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 wie Mac OS X ; en-us) AppleWebKit/532.9 (KHTML, wie Gecko) Mobile/7D11

Wie würde ich die iOS-Version mit regulären Ausdrücken erkennen, so dass sie z.

4,0

für den oben User-Agent?

+1

Welche Sprache würden Sie es mit sein zu extrahieren? –

+0

Ich kodiere in PHP – user1477182

Antwort

5

sollten Dieser reguläre Ausdruck tun, was Sie wollen:

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

Sie haben die beiden passenden Gruppenwerte zu erfassen, wie Sie zu tun, hängt es von der Sprache verwenden ...

mit PHP Sie kann es auf diese Weise tun:

$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

Vielen Dank! Wenn ich dies in PHP tun würde, würde ich einfach das obige Muster in einer preg_match-Funktion verwenden? – user1477182

+0

Ja, Sie können es verwenden. Sehen Sie meine aktualisierte Antwort ... – aleroot

+0

Vielen Dank! :) – user1477182

9

Die RegEx, die für mich arbeitet, ist:

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

Ein iPad 5.1.1 hat eine HTTP_USER_AGENT wie folgt aus:

"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 Zahlen in der iOS-Version und nicht iPhone OS vorhanden.

Eine mögliche könnte Ruby-Implementierung sein:

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 

Es gibt nil wenn nicht iOS Version

gefunden wird
3

Diese Regex

/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/ 
wie 4.0 oder 6.1.3 2 und 3 Segmente entsprechen

Javascript Beispiel:

> 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"] 

Beachten Sie, dass dies auch mit anderen Geräten übereinstimmen kann. Testen Sie dies also auf einem iOS-Gerät.

Dadurch wird die OS X-Version auf einem Mac zurückgegeben. mit .split('_');

> 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"] 

Sie können auch die _ durch . mit .replace(/_/g,'.'); ersetzen möchten oder es sogar zu einem Array konvertieren.

_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

fand ich die vorhandenen Antworten eine Rate guten Erfolg nicht haben, wenn sie gegen den möglichen User-Agent-Strings auf dieser Web-Seite von Agent-Strings Beispiel Benutzer getestet:

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

ich geschaffen habe, die folgende Regex, die mehr Erfolg hat, wenn sie gegen diese Beispiele getestet wird:

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

Die vierte Gruppe enthält die ios-Version Nummer im Format x_y_z oder x.y.z wobei y und z optional sind.

Es gibt 7 Beispiele User Agent Strings, die keine Versionsnummer enthalten, so dass diese nicht übereinstimmen. Es gibt einen Beispielstring, bei dem die ios-Version "7.1" ist, aber der Regex stimmt nur mit der Hauptversionsnummer "7" überein (das war gut genug für meinen Anwendungsfall)

Ebenso wie die Tests auf der obigen Seite wurde gegen die ios10 Agent Strings getestet auf dieser Seite aufgelistet:

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