OS・ブラウザの判別

OS・ブラウザの判別

☆ ブラウザを判別する
 ブラウザによって異なる処理を行いたい場合、事前にページを開いているブラウザを判別する必要があります。
 JavaScriptでは、それを簡単に行うことができる関数(プロパティ)が用意されています。
 まず、'navigator'オブジェクトの'appName'プロパティで、ここにはブラウザ名を表す文字列が格納されています。たとえば、IEの場合は'Microsoft Internet Explorer'です。
 次に、'navigator'オブジェクトの'appVersion'プロパティで、ブラウザのバージョン番号と続けて(その他の付加情報)が格納されています。
 これらの文字列を調べて場合分けすれば、大体うまくいきます。
// ブラウザの判別

ブラウザ名:
バージョン:
(付加情報):
 各情報を取得した後の文字列走査と判定にはいろんな方法がありますが、上記例では正規表現を使っています。
 この手法だとIEのバージョンが'6.0'などの場合でも、'4.0'になると思います。この対処については、次の項目を参照してください。
☆ OS・ブラウザを詳細に判別する
 前の項目の最後で触れたように、ブラウザのバージョンが正しく取得できなかったり(正確にはMozillaのバージョンが返されているようです・・・)、 Operaなどのようにブラウザ側で変更できたりして、意図したものが得られない場合があります。このような場合は、'navigator'オブジェクトの'userAgent'プロパティを使用します。このプロパティには、ブラウザごとに独自の文字列が割り当てられており、これを解析することでプログラマー自らOS・ブラウザ判別する'appName','appVersion'のカスタム関数を作成しようということです。
 たとえば、'Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)'というような文字列だったとすると、OSは'Windows 98',ブラウザはMSIEから'Internet Explorer',バージョンは'6.0'と判断できます。しかし、現実的にはこんなに単純に判断できるわけではなく、また、どんなブラウザがどんな文字列を返すのかを広範囲にわたって知っておかなければなりません。これについては、下記のサイトにて情報が公開されておりますので参照してください。
www.futomi.com/  
 このサイトではライブラリも公開されているのですが、『Perl』版ですので『JavaScript』版にしてWindows XPなど未対応部分の修正を加えたものをダウンロードできるようにしましたのでご利用ください。
 また、このスクリプトを使った当サイト内のページも参考までにご覧ください。

//ユーザーエージェントの分析

function user_agent(){
data = navigator.userAgent;
platform = '';
platform_v = '';
browser = '';
browset_v = '';
if(data.match(/DoCoMo/i)) {
platform = 'DoCoMo';
ar = data.split(/\//);
browser = 'DoCoMo';
browser_v = ar[1];
platform_v = ar[2];
if(platform_v == '') {
platform_v = '';
}
} else if(data.match(/Cuam Ver([0-9\.]+)/i)) {
platform = 'Windows';
platform_v = '';
browser = 'Cuam';
browser_v = RegExp.$1;
} else if(data.match(/^JustView\/([0-9\.]+)/)) {
platform = 'Windows';
platform_v = '';
browser = 'JustView';
browser_v = RegExp.$1;
} else if(data.match(/^sharp pda browser\/([0-9\.]+).*\*1 {
platform = 'ZAURUS';
platform_v = RegExp.$2;
browser = 'sharp_pda_browser';
browser_v = RegExp.$1;
} else if(data.match(/^Mozilla\/.+ \(DreamPassport\/([0-9\.])/)) {
platform = 'Dreamcast';
platform_v = '';
browser = 'DreamPassport';
browser_v = RegExp.$1;
} else if(data.match(/^Sonybrowser2 \(.+\/PlayStation2 .+\)/)) {
platform = 'PlayStation2';
platform_v = '';
browser = 'Sonybrowser2';
browser_v = '';
} else if(data.match(/UP\.Browser/i)) {
browser = 'UP.Browser';
ar = data.split(/ /);
ar2 = ar[0].split(/\//);
ar3 = ar2[1].split(/\-/);
browser_v = ar3[0];
platform_v = ar3[1];
devid = '';
if (platform_v == 'SN12') {devid = 'au,C404S';}
else if(platform_v == 'ST11') {devid = 'au,C403ST';}
else if(platform_v == 'DN11') {devid = 'au,C402DE';}
else if(platform_v == 'SY12') {devid = 'au,C401SA';}
else if(platform_v == 'CA12') {devid = 'au,C311CA';}
else if(platform_v == 'TS12') {devid = 'au,C310T';}
else if(platform_v == 'HI12') {devid = 'au,C309H';}
else if(platform_v == 'MA11') {devid = 'au,C308P';}
else if(platform_v == 'MA12') {devid = 'au,C308P';}
else if(platform_v == 'KC11') {devid = 'au,C307K';}
else if(platform_v == 'SN11') {devid = 'au,C305S';}
else if(platform_v == 'SY11') {devid = 'au,C304A';}
else if(platform_v == 'CA11') {devid = 'au,C303CA';}
else if(platform_v == 'HI11') {devid = 'au,C302H';}
else if(platform_v == 'TS11') {devid = 'au,C301T';}
else if(platform_v == 'DN01') {devid = 'au,C202DE';}
else if(platform_v == 'HI01') {devid = 'au,C201H';}
else if(platform_v == 'SNI1') {devid = 'au,705G';}
else if(platform_v == 'MAI1') {devid = 'au,704G';}
else if(platform_v == 'MAI2') {devid = 'au,704G';}
else if(platform_v == 'KCI1') {devid = 'au,703G';}
else if(platform_v == 'KCI2') {devid = 'au,702G';}
else if(platform_v == 'TSI1') {devid = 'au,701G';}
else if(platform_v == 'SNC1') {devid = 'au,D306S';}
else if(platform_v == 'MAC1') {devid = 'au,D305P';}
else if(platform_v == 'MAC2') {devid = 'au,D305P';}
else if(platform_v == 'KCC2') {devid = 'au,D303K';}
else if(platform_v == 'TS11') {devid = 'au,D302T';}
else if(platform_v == 'SYC1') {devid = 'au,D301SA';}
else if(platform_v == 'KCT6') {devid = 'TU-KA,TK05';}
else if(platform_v == 'TST3') {devid = 'TU-KA,TT03';}
else if(platform_v == 'KCT5') {devid = 'TU-KA,TK04';}
else if(platform_v == 'KCT4') {devid = 'TU-KA,TK03';}
else if(platform_v == 'SYT2') {devid = 'TU-KA,TS02';}
else if(platform_v == 'MAT1') {devid = 'TU-KA,TP01';}
else if(platform_v == 'MAT2') {devid = 'TU-KA,TP01';}
else if(platform_v == 'TST1') {devid = 'TU-KA,TT02';}
else if(platform_v == 'KCT1') {devid = 'TU-KA,TK02';}
else if(platform_v == 'KCT2') {devid = 'TU-KA,TK01';}
else if(platform_v == 'SYT1') {devid = 'TU-KA,TS01';}
else if(platform_v == 'TST1') {devid = 'TU-KA,TT01';}
else if(platform_v == 'D2') {devid = 'DoCoMo,D2';}
else if(platform_v == 'P-PAT'){devid = 'DoCoMo,P-PAT';}
if(devid == '') {
platform = '';
platform_v = '';
} else {
ar4 = devid.split(/,/);
platform = ar4[0];
platform_v = ar4[1];
}
} else if(data.match(/^J-PHONE\/(.+)\/(.+)/)) {
platform = 'J-PHONE';
browser = 'J-PHONE';
browser_v = RegExp.$1;
platform_v = RegExp.$2;
} else if(data.match(/^ASTEL\/(.+)\/(.+)\/(.+)\//)) {
platform = 'ASTEL';
browser = 'ASTEL';
browser_v = '';
platform_v = '';
for(i = 0; i < 4; i++){ platform_v += RegExp.$2.charAt[i]; }
} else if(data.match(/^WebFetch$/i)) {
browser = 'WebFetch';
browser_v = '';
platform = '';
platform_v = '';
} else if(data.match(/^Internet Ninja ([0-9\.]+)$/i)) {
browser = 'Internet Ninja';
browser_v = RegExp.$1;
platform = '';
platform_v = '';
} else if(data.match(/^Sleipnir Version ([0-9\.]+)$/i)) {
browser = 'Sleipnir';
browser_v = RegExp.$1;
platform = '';
platform_v = '';
} else if(data.match(/^Mozilla\/.+ AVE-Front\/(.+) \(.+\;Product=(.+)\;.+\)/)) {
browser = 'NetFront';
browser_v = RegExp.$1;
platform = RegExp.$2;
platform_v = '';
} else if(data.match(/^Mozilla\/.+ Foliage-iBrowser\/([0-9\.]+) \(WinCE\)/)) {
platform = 'Windows';
platform_v = 'CE';
browser = 'Foliage-iBrowser';
browser_v = RegExp.$1;
} else if(data.match(/^Mozilla\/.+\(compatible\; MSPIE ([0-9\.]+)\; Windows CE/)) {
platform = 'Windows';
platform_v = 'CE';
browser = 'PocketIE';
browser_v = RegExp.$1;
} else if(data.match(/Opera[\ \/]([0-9\.]+)/)) {
browser = 'Opera';
browser_v = RegExp.$1;

if(data.match(/Windows 3\.1/i)) {
platform = 'Windows';
platform_v = '3.1';
} else if(data.match(/Win32/i)) {
platform = 'Windows';
platform_v = '32';
} else if(data.match(/Windows 95/i)) {
platform = 'Windows';
platform_v = '95';
} else if(data.match(/Windows 98/i)) {
platform = 'Windows';
if(data.match(/Win 9x 4\.90/)) {
platform_v = 'Me';
} else {
platform_v = '98';
}
} else if(data.match(/Windows ME/i)) {
platform = 'Windows';
platform_v = 'Me';
} else if(data.match(/Windows NT 5\.0/i) || data.match(/Windows 2000/i)) {
platform = 'Windows';
platform_v = '2000';
} else if(data.match(/Windows NT 5\.1/i) || data.match(/Windows XP/i)) {
platform = 'Windows';
platform_v = 'XP';
} else if(data.match(/Windows NT/i) && !data.match(/Windows NT 5\.0/i)) {
platform = 'Windows';
platform_v = 'NT';
} else if(data.match(/Windows CE/i)) {
platform = 'Windows';
platform_v = 'CE';
} else if(data.match(/Mac/i)) {
platform = 'MacOS';
if(data.match(/Mac_68000/i)) {
platform_v = '68K';
} else if(data.match(/Mac_PowerPC/i)) {
platform_v = 'PowerPC';
}
} else if(data.match(/WebTV/i)) {
platform = 'WebTV';
ar = data.split(/ /);
ar2 = ar[1].split(/\//);
platform_v = ar2[1];
} else {
platform = '';
platform_v = '';
}
} else if(data.match(/^Mozilla\/.+\(compatible\; MSIE .+\;.+\)/)) {
if(data.match(/NetCaptor ([0-9\.]+)/)) {
browser = 'NetCaptor';
browser_v = RegExp.$1;
} else {
browser = 'InternetExplorer';
data2 = data;
data2 = data2.replace(/ /g, '');
ar = data2.split(/\;/);
ar2 = new Array();
cnt = 0;
for(i = 0; i < ar.length; i++){
if (ar[i].match(/MSIE/i)){
ar2[cnt] = ar[i];
cnt++;
}
}
browser_v = ar2[0];
browser_v = browser_v.replace(/MSIE/g, '');
if(browser_v.match(/^([0-9]+)\.([0-9]+)/)) {
browser_v = RegExp.$1 + '\.' + RegExp.$2;
}
}

if(data.match(/Windows 3\.1/i)) {
platform = 'Windows';
platform_v = '3.1';
} else if(data.match(/Win32/i)) {
platform = 'Windows';
platform_v = '32';
} else if(data.match(/Windows 95/i)) {
platform = 'Windows';
platform_v = '95';
} else if(data.match(/Windows 98/i)) {
platform = 'Windows';
if(data.match(/Win 9x 4\.90/)) {
platform_v = 'Me';
} else {
platform_v = '98';
}
} else if(data.match(/Windows ME/i)) {
platform = 'Windows';
platform_v = 'Me';
} else if(data.match(/Windows NT 5\.0/i) || data.match(/Windows 2000/i)) {
platform = 'Windows';
platform_v = '2000';
} else if(data.match(/Windows NT 5\.1/i) || data.match(/Windows XP/i)) {
platform = 'Windows';
platform_v = 'XP';
} else if(data.match(/Windows NT/i) && !data.match(/Windows NT 5\.0/i)) {
platform = 'Windows';
platform_v = 'NT';
} else if(data.match(/Windows CE/i)) {
platform = 'Windows';
platform_v = 'CE';
} else if(data.match(/Mac/i)) {
platform = 'MacOS';
if(data.match(/Mac_68000/i)) {
platform_v = '68K';
} else if(data.match(/Mac_PowerPC/i)) {
platform_v = 'PowerPC';
}
} else if(data.match(/WebTV/i)) {
platform = 'WebTV';
ar = data.split(/ /);
ar2 = ar[1].split(/\//);
platform_v = ar2[1];
} else {
platform = '';
platform_v = '';
}
} else if(data.match(/^Mozilla\/([0-9\.]+).*\(.+\; [NIU]/)) {
browser = 'NetscapeNavigator';
browser_v = RegExp.$1;
if(browser_v == '5.0'){
if(data.match(/ Netscape[0-9]*\/([0-9\.b]+)$/)){
browser_v = RegExp.$1;
}
else{
browser_v = '6.0';
}
}

if(data.match(/Win95/)) {
platform = 'Windows';
platform_v = '95';
} else if(data.match(/Win 9x 4\.90/i)) {
platform = 'Windows';
platform_v = 'Me';
} else if(data.match(/Win98/i)) {
platform = 'Windows';
platform_v = '98';
} else if(data.match(/Windows NT 5\.0/i) || data.match(/Windows 2000/i)) {
platform = 'Windows';
platform_v = '2000';
} else if(data.match(/Windows NT 5\.1/i) || data.match(/Windows XP/i)) {
platform = 'Windows';
platform_v = 'XP';
} else if(data.match(/WinNT/i)) {
platform = 'Windows';
platform_v = 'NT';
} else if(data.match(/Macintosh/i)) {
platform = 'MacOS';
if(data.match(/68K/i)) {
platform_v = '68K';
} else if(data.match(/PPC/i)) {
platform_v = 'PowerPC';
}
} else if(data.match(/SunOS/i)) {
platform = 'SunOS';
ar = data.split(/\;/);
ar2 = ar[2].split(/ /);
platform_v = ar2[2];
} else if(data.match(/Linux/i)) {
platform = 'Linux';
ar = data.split(/ /);
flag = false;
for(i = 0; i < ar.length; i++){
if (flag) {
platform_v = ar[i];
break;
}
if (ar[i].match(/^Linux$/i)){ flag = true; }
}
} else if(data.match(/FreeBSD/i)) {
platform = 'FreeBSD';
ar = data.split(/ /);
flag = false;
for(i = 0; i < ar.length; i++){
if (flag) {
platform_v = ar[i];
break;
}
if (ar[i].match(/^FreeBSD$/i)){ flag = true; }
}
} else if(data.match(/NetBSD/i)) {
platform = 'NetBSD';
platform_v = '';
} else if(data.match(/AIX/i)) {
platform = 'AIX';
platform_v = '';
} else if(data.match(/IRIX/i)) {
platform = 'IRIX';
ar = data.split(/ /);
flag = false;
for(i = 0; i < ar.length; i++){
if (flag) {
platform_v = ar[i];
break;
}
if (ar[i].match(/^IRIX$/i)){ flag = true; }
}
} else if(data.match(/HP-UX/i)) {
platform = 'HP-UX';
platform_v = '';
} else if(data.match(/OSF1/i)) {
platform = 'OSF1';
ar = data.split(/ /);
flag = false;
for(i = 0; i < ar.length; i++){
if (flag) {
platform_v = ar[i];
break;
}
if (ar[i].match(/^OSF1$/i)){ flag = true; }
}
} else {
platform = '';
platform_v = '';
}
} else {
platform = '';
platform_v = '';
browser = '';
browser_v = '';
}

return (new Array(platform, platform_v, browser, browser_v));
};

*1:.+)\//