2012-06-23 5 views
5

Se ho un user-agent iOS comeRilevazione iOS numero di versione da User Agent utilizzando le espressioni regolari

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

o

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

Come posso rilevare la versione di iOS utilizzando le espressioni regolari in modo che restituisca ad es.

4,0

per l'user agent di cui sopra?

+1

che lingua saresti estraendolo con? –

+0

Sto codificando in PHP – user1477182

risposta

5

Questa espressione regolare dovrebbe fare quello che vuoi:

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

bisogna catturare i due valori di gruppo di corrispondenza, come farlo dipende dalla lingua che si usa ...

con PHP si può farlo in questo modo:

$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

Molte grazie! Se dovessi farlo in PHP, dovrei semplicemente usare lo schema sopra in una funzione preg_match? – user1477182

+0

Sì, puoi usarlo. Vedi la mia risposta aggiornata ... – aleroot

+0

Grazie mille! :) – user1477182

9

l'espressione regolare che sta lavorando per me è:

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

Un iPad 5.1.1 ha un HTTP_USER_AGENT come questo:

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

Così 3 numeri della versione di iOS e non iPhone OS presente.

Una possibile implementazione di Ruby potrebbe essere:

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 

Riporta nil se non la versione iOS trovato

3

Questa espressione regolare corrisponderà 2 e 3 segmenti, come 4.0 o 6.1.3

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

Javascript Esempio:

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

Nota che questo potrebbe corrispondere anche ad altri dispositivi, quindi assicurati di testarlo su un dispositivo iOS.

Ciò restituirà la versione OS X su un 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"] 

Si consiglia inoltre di sostituire il _ da . utilizzando .replace(/_/g,'.'); o anche convertirlo in un array utilizzando .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

ho trovato le risposte esistenti non hanno avuto un buon successo nel testata nei confronti dei possibili stringhe user agent in questa pagina web di stringhe agente utente esempio:

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

ho creato la seguente espressione regolare che ha più successo quando testato contro questi esempi:

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

il quarto gruppo contiene la versione ios numero che è nel formato x_y_z o x.y.z dove y e z sono opzionali.

Esistono 7 esempi di stringhe dell'agente utente che non contengono alcun numero di versione, in modo che quelle particolari non corrispondano. C'è una stringa di esempio in cui la versione ios è "7.1" ma la regex corrisponde solo al numero di versione principale "7" (questo era abbastanza buono per il mio caso d'uso)

Così come i test nella pagina precedente è anche stato testato contro le corde agente ios10 elencati in questa pagina:

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