2011-03-14 3 views
16

Я пытаюсь найти парсер или регулярное выражение, которое даст мне версию ОС Android из строки пользовательского агента.Получить версию ОС Android от user-agent

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 

Вернется:

2.2.1 

Может кто-нибудь помочь?

+1

пост Другие Android блога: HTTP://android-developers.blogspot.com/2010/12/android-browser-user-agent-issues.html – Macarse

+0

см. это http://stackoverflow.com/posts/comments/25303065?noredirect=1 – user1531437

ответ

1

Regex должен работать, что-то вдоль линий непроверенных

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

А затем использовать любые функции регулярных выражений вы используете, чтобы получить ту часть внутри скобок.

+0

Это не удастся для ' Android 1.5'. – Macarse

+0

@ Маркарсе, вы правы, вам придется приспособиться к этому. Я не был уверен, был ли гарантирован хотя бы 0,0 на конце. Редактирование должно исправить эту проблему. – alternative

+0

Я бы порекомендовал вам избежать ненужного захвата в регулярном выражении. Это просто хорошая практика, и на некоторых языках мне говорят, что она дает преимущества в производительности. – fearphage

22

Это регулярное выражение немного больше «на будущее», чем mathepic's answer:

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

Это позволяет несколько цифр в каждом месте, а также дополнительные периоды в номере версии. Android уже три года, и мы на 3.0. В итоге мы доберемся до 10.0.0.

Это будет ловить все следующие:

  • 1.6 (реальная)
  • 2.3.4 (реальный)
  • 12.34.56 (. Подделкой, но один день ...)
  • 3.4.5.6 и 4.5.6.7.8.9 (подделка ... но на всякий случай)

Это может быть написано немного более строго, как:

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

Это более близко относится к схеме, которую мы уже видели, но потенциально может пропустить некоторые версии, они решили добавить дополнительный .1 в конце версии. Он также соответствует будущему версии 10.0.0.

+0

Осторожно: это также будет соответствовать «ОпределенноNotAndroid 0.0 ";-) Возможно, вы захотите добавить' \ b' в начало. –

+0

И поскольку мы говорим о будущей проверке: я бы избегал жесткого кодирования ';' и заменял его на '[;]] 'или' \ b'. Теоретическая параноидальная версия * может * использовать 'Mozilla/5.0 (Linux; U; Android 2.2.1)'. –

+1

Достаточно честно, +1 Полагаю, это выглядит немного лучше, но я также думаю, что это несколько сложнее понять. В любом случае я, вероятно, должен был использовать + на моих цифрах. – alternative

1

Могу ли я представить ответ, который другие могут легко скопировать и вставить.

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

пользовательских агентов игрок Motorola может иметь следующее:

Linux;Android ; Release/4.1.2 

Таким образом, я должен был начать использовать следующее:

[a|A]ndroid[^\d]*([\d[_|.]]+\d) 
Смежные вопросы