2010-11-23 9 views
2

J'ai trouvé une méthode en ligne pour séparer les vues lors de la visualisation d'une application Ruby on Rails sur un iPhone et il analyse l'agent utilisateur pour le détecter. Je cible spécifiquement iOS 4.2+ car les versions précédentes ne prennent pas en charge les Sockets Web HTML5 dont j'ai besoin pour mon application.Analyse de l'agent utilisateur avec Regex

Jusqu'à présent, je suis l'analyse /(iPhone.+OS.+4_2.+Safari)/ et il semble fonctionner un traitement, mais le problème que je suis est que si vous utilisiez une version bêta ou une future de l'OS l'agent utilisateur pourrait ne pas inclure 4_2 mais il peut soutenir Web Prises

Ma question est .. comment pourrais-je analyser la chaîne pour avoir le résultat suivant:

  • S'il y a 4 ou plus
  • (en option?) Suivi par quoi que ce soit

Mon Regex est terrible, alors excusez la question stupide :-)

Merci à l'avance! Tom.

Répondre

0

Il est pas réellement possible de "fiable" analyser une chaîne de l'agent utilisateur; plusieurs chaînes User-Agent courantes violent HTTP 1.1 (j'oublie le numéro RFC) WRT les caractères autorisés entre les parenthèses (. ou/ou quelque chose?). Le sniffing d'utilisateur-agent est assez fragile quand vous voulez "whitelist" certaines fonctionnalités et mène à des plaintes au sujet du traitement préférentiel de certains navigateurs au-dessus d'autres (surtout quand Microsoft le fait), et signifie que quelqu'un doit garder regex géant mis à jour.

N'y a-t-il pas vraiment de meilleur moyen (par exemple avec JavaScript?) De détecter les fonctionnalités prises en charge par le navigateur.

Néanmoins, vous pouvez faire quelque chose comme ; *CPU +iPhone +OS +(4_(2|[3-9]|\d\d)|[5-9]|\d\d)\[0-9a-zA-Z_]* +like +Mac +OS +X *;.

0

Bien que cela puisse techniquement être fait, vous devez énumérer tous les futurs numéros de version possibles explicitement. regex est un outil de correspondance de texte; il n'y a pas de moyen facile d'inclure une logique telle que "retourner vrai si le nombre est plus grand que cela, faux si plus petit". Vous voudrez probablement juste extraire la chaîne numérique ([0-9]+_[0-9]+ ou quelque chose) et ensuite faire la logique sur la sortie de cela.

0

([5-9]|\d\d)[^+]*