読者です 読者をやめる 読者になる 読者になる

ゴミ溜め@技術系日常系雑文

主にWeb技術やそのほかつまづいたこととか引っかかって調べたこととかをまとめてます。

はてなダイアリーから引っ越しました。)

備考録。ユーザーエージェントで処理を分ける。

PHP

備考録。
ユーザーエージェントからブラウザ、ブラウザバージョンを特定し、スマフォであれば$is_mobileをtrueにするPHPコード。

<?php
// ユーザーエージェントは下記が参考になる。
// http://www.openspc2.org/userAgent/

// ユーザーエージェントの取得。
$ua = $_SERVER['HTTP_USER_AGENT'];

$browser = 'Unknown';
$version = 0;
$is_mobile = false;

// ブラウザの判別。
if( preg_match("/(MSIE|Chrome|Firefox|Android|Safari|Opera)[\/ ]([0-9.]*)/", $ua, $match ) ) {
  $browser = $match[1];
  $version = explode( ".", $match[2] );
    // ブラウザバージョンはドット区切りで配列として格納。
    // (メジャーバージョンの数値の大小で比較し安くするため。)
}

// デバイスがモバイル端末であるか判別。(タブレットは除く。)
if( preg_match("/(iPhone|iPod|Windows Phone|Opera Mobi|Fennec|Android)/",$ua, $match ) ) {
  // Opera MobiはAndroid版Opera、FennecはAndroid版Firefox。
  // なお、UA文字列中の"Opera Mobi""Fennec"という文字列は"Android"より後に記述されているので、
  // 比較する順序に注意する。
  // ex.
  //   Opera/9.80 (Android 2.3.3; Linux; Opera Mobi/ADR-1111101157; U; ja) Presto/2.9.201 Version/11.50
  //   Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0
  
  // Androidであり、Mobileを含まない場合は除外。
  // 標準のAndroidブラウザの場合、UAにMobileという文字列を含むので、
  // これの有無によってタブレットかスマフォかを判断する。
  if( !( $match[1] == "Android" && !preg_match("/Mobile/",$ua) ) ) {
    $is_mobile = true;
  }
}
?>

HTMLで出力してみるには

<!DOCTYPE html>
<html><head><meta charset="UTF-8">
<title>ユーザーエージェントを判別する。</title></head><body>

<p>User Agent: <?=$ua?></p>
<p>あなたのブラウザは 
<?=$browser?>                                   <!-- ブラウザ名を表示 -->          
<?=implode(".",$version)?>                      <!-- ブラウザバージョンをドット区切りで表示 -->
( <?= $is_mobile ? "mobile" : "not mobile" ?> ) <!-- モバイルか否かを表示 -->
</p>

</body></html>

なんにせよ、ユーザーエージェントはバージョンが変わると書式が変わる可能性もある不確かなものなので、厳密な判別には使えない。
主にモバイル用とPC・タブレット用でCSSを変更するとか、とか。