JavaScript難題:userAgentだけでMacOSのバージョンを引っこ抜くチャレンジ

JavaScript環境で、navigator.userAgentを見てMacOSのバージョンだけを引っこ抜く方法があるか検討してみました。 Windowsなら入ってるんですけどね、Macって結構カオスだったはずなんですが限定すれば意外とイケるかも?です。

javascript logo

注) 特に上のロゴは寂しいので置いただけです。以下のサイトで作れました。

MOJI MAKER Z | ドラゴンボールZ 神と神 2013年3月30日全国超拡大公開!

調査

なぜMacOSのバージョン判定がカオスか?それは簡単。「色々な記述があるから・・・」です。

試しに見てみましょう。今使ってるChromeのuserAgentは・・・

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.58 Safari/537.36

はい、次はSafari

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.73.11 (KHTML, like Gecko) Version/7.0.1 Safari/537.73.11

最後にFirefox

Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:27.0) Gecko/20100101 Firefox/27.0

あれ、なんか昔はja-JPとかそもそもVersion書いてないとかありましたけど、意外とイケるくさい・・・!?(PowerPPCとか・・・)

ちょっとこちらのサイトで見てみたら、以下の環境以上ならなんか似通ったルールになってました。

  • Firefox 3.0以上(最新:27)
  • Safari 3.1.x以上(最新:7.0.1)
  • Chrome 11以上(最新:33)
  • Opera 12以上(最新:19)

うん、もう割り切りでいいよね・・・。

ということでこんな正規表現でバージョン抜き出して綺麗に整形!

結果

Mac OS X ([0-9]+)[_.]([0-9])[_.]?([0-9]?)

これをString.match()あたりに使うと1個目〜最大3個目までバージョンナンバー取れます。 最後の3個目はFirefoxの場合取れないのでまぁそこはよしなに。(”?”にしてるので取れなくても正規表現は反応します)

もし、メンテナンスバージョン部分を取れるか取れないかで分けるならこんな感じ。

メンテナンスバージョンまで取れる場合

Mac OS X ([0-9]+)[_.]([0-9])[_.]([0-9])

メンテナンスバージョンが取れない場合(Firefoxなど)

Mac OS X ([0-9]+)[_.]([0-9]);

まとめ

  • ここ2〜3年以内のブラウザであればMacのOSだけ判別可能
  • 判定可能なMacOSのバージョン自体は大体10.5(Leopard)以上ぐらい(ブラウザによって異なる)
  • メンテナンスバージョン部分はFirefoxの場合取れない

サンプルコードはこちら。Mac環境の方がアクセスしたらなんとなく表示されます。