Edited at

UserAgentからAndroidの端末名を取得する方法

More than 3 years have passed since last update.

いまさらかもですが、一部の?ロリポップ(Lolipop)端末のWebViewのUserAgent仕様が変更になりました。

変更点としては、ビルド番号の後に"wv"という文字列が追加されたようです。

Mozilla/5.0 (Linux; Android 5.0.2; SHV32 Build/S5231; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/42.0.2311.129 Mobile Safari/537.36

ということで、昔書いた正規表現のプログラムを書き直しました。


getAndroidDeviceName.php

     // UA取得

$userAgent = $_SERVER['HTTP_USER_AGENT'];

// テスト用UA
// 5.1系Chrome
// $userAgent = "Mozilla/5.0 (Linux; Android 5.1; KYV35 Build/xxxx) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36";
// 5.1系WebView
// $userAgent = "Mozilla/5.0 (Linux; Android 5.1; KYV35 Build/xxxx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36";
// 5.0系Chrome
// $userAgent = "Mozilla/5.0 (Linux; Android 5.0.2; SHV32 Build/S5231) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Mobile Safari/537.36";
// 5.0系WebView
// $userAgent = "Mozilla/5.0 (Linux; Android 5.0.2; SHV32 Build/S5231; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/42.0.2311.129 Mobile Safari/537.36";
// 4.4系標準ブラウザ
// $userAgent = "Mozilla/5.0 (Linux; U; Android 4.4.2; ja-jp; HTL23 Build/KOT49H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30";
// 4.4系Chrome
// $userAgent = "Mozilla/5.0 (Linux; Android 4.4.2; HTL23 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36";
// 4.4系WebView
// $userAgent ="Mozilla/5.0 (Linux; Android 4.4.2; HTL23 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36";
// 4.1系標準ブラウザ
// $userAgent = "Mozilla/5.0 (Linux; U; Android 4.1.2; ja-jp; SonySOL21 Build/9.1.D.0.395) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30";
// 4.1系Chrome
// $userAgent = "Mozilla/5.0 (Linux; Android 4.1.2; SOL21 Build/9.1.D.0.395) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19";
// 4.0系
// $userAgent = "Mozilla/5.0 (Linux; U; Android 4.0.4; ja-jp; SonyEricssonIS12S Build/6.1.D.0.170) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30";
// 2.3系
// $userAgent = "Mozilla/5.0 (Linux; U; Android 2.3.4; ja-jp; SonyEricssonIS11S Build/4.0.1.B.0.112) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1";

// Android端末情報抽出
$matches = array();
preg_match("/\(.*Android[^\)]*\)/i", $userAgent, $matches);

if (isset($matches[0])) { // Android端末の場合
// UA分解
$breakList = explode(";", $matches[0]);

// 端末名はBuild番号の前に記述されているという前提条件あり!
$tmpDeviceName = "";
foreach($breakList as $val) {
if (strpos($val, 'Build') === false) {
continue;
} else {
$tmpDeviceName = $val;
break;
}
}

// 端末名抽出(キャプチャグループ利用)
$matches = array();
preg_match('/ ([0-9A-Za-z\-\_ \/]+) Build\/[0-9A-Za-z\.\_]+?\)?/i', $tmpDeviceName, $matches);
$deviceName = isset($matches[1]) ? $matches[1] : "odd android device";

} else { // 非Android端末の場合
$deviceName = "non android device";
}

echo $deviceName;


http://www.au.kddi.com/developer/android/kishu/ua/

上記から適当な端末を抽出して検証していますが、正規表現苦手なので、もっとこうした方がいいとか不具合とかあれば教えてください。(利用は自己責任でお願いします)