2011-03-14 29 views
16

He estado tratando de encontrar un analizador o una expresión regular que me proporcione la versión del sistema operativo Android a partir de una cadena de agente de usuario.Obtener la versión del sistema operativo Android del agente de usuario

E.g.

Mozilla/5.0 (Linux; U; Android 2.2.1; fr-fr; Desire HD Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 

volveremos: el

2.2.1 

¿Alguien puede ayudar?

+1

posterior relacionada blog de Android: http://android-developers.blogspot.com/2010/12/android-browser-user-agent-issues.html – Macarse

+0

ver esto http://stackoverflow.com/posts/comments/25303065?noredirect=1 – user1531437

Respuesta

1

expresión regular debería funcionar, algo en la línea de no probados

Android ([0-9]\.[0-9](\.[0-9])?);

y luego usar cualquier función de expresiones regulares que se utiliza para conseguir que la parte interior de los parens.

+0

Esto no funcionará para ' Android 1.5'. – Macarse

+0

@Marcarse tienes razón, tendrás que adaptarte a eso. No estaba seguro de si había una garantía de por lo menos .0 al final. La edición debería solucionar ese problema. – alternative

+0

Te recomiendo que evites capturar innecesariamente en expresiones regulares. Es solo una buena práctica y me han dicho en algunos idiomas que ofrece beneficios de rendimiento. – fearphage

22

Esta expresión regular es un poco más "a prueba del futuro" que mathepic's answer:

Android (\d+(?:\.\d+)+); 

Permite múltiples dígitos en cada lugar, así como los períodos adicionales en el número de versión. Android ha estado fuera 3 años y estamos en 3.0. Eventualmente llegaremos a 10.0.0.

Esto cogerá todo lo siguiente:

  • 1,6 (real)
  • 2.3.4 (real)
  • 12.34.56 (. Falso, pero un día ...)
  • 3.4.5.6 y 4.5.6.7.8.9 (falso ... pero por si acaso)

Esto se podría escribir un poco más estrictamente como:

Android (\d+(?:\.\d+){1,2}); 

Esto se apega más al esquema que ya hemos visto utilizado, pero podría perderse algunas versiones de que decidan agregar un .1 adicional al final de una versión. También coincide para la futura versión 10.0.0.

+0

Cuidado: esto también coincidirá con "DefinitelyNotAndroid 0".0 ";-) Es posible que desee agregar un' \ b' al frente. –

+0

Y como estamos hablando de protección contra el futuro: evitaría la codificación rígida ';' y la reemplazaría por '[;)] 'o' \ b'. Una versión paranoica teórica * podría * usar 'Mozilla/5.0 (Linux; U; Android 2.2.1)'. –

+1

Lo suficiente, +1 supongo. Se ve un poco mejor, pero también creo que es algo más difícil de entender. En cualquier caso, probablemente debería haber usado + 's en mis dígitos. – alternative

1

Puedo presentar una respuesta que otros puedan copiar y pegar fácilmente.

navigator.userAgent.match(/Android [\d+\.]{3,5}/)[0].replace('Android ','') 
2

agentes reproductor usuario de Motorola puede tener los siguientes:

Linux;Android ; Release/4.1.2 

Por lo tanto, he tenido que empezar a utilizar el siguiente:

[a|A]ndroid[^\d]*([\d[_|.]]+\d) 
Cuestiones relacionadas