HOWTO · PHP

PHP でモバイルデバイスを検出する方法

Mobile Detect またはユーザーエージェントパターンを使って、PHP でモバイルリクエストを分類する方法を学びます。

このページの内容

PHPでは、Composerでインストールする mobiledetect ライブラリを使う方法と、$_SERVER から HTTP_USER_AGENT を取得して preg_match() で照合する方法で、リクエストをモバイルとして分類できます。どちらもリクエストヘッダーからデバイスの種類を推定する方法であり、実際にどの端末からリクエストされたかを証明するものではありません。

PHPで mobiledetect クラスを使ってモバイルデバイスを検出する

Composerを使い、composer require mobiledetect/mobiledetectlib を実行してプロジェクトに mobiledetect ライブラリをインストールします。次にComposerの vendor/autoload.php を読み込み、Mobile_Detect のインスタンスを作成します。このライブラリは、ユーザーエージェント文字列などのリクエスト情報やその他のヘッダーを使ってクライアントを分類します。

基本的なモバイル判定には $detect->isMobile() を呼び出します。戻り値は真偽値なので、if/else 分岐でモバイルと非モバイルの結果を選べます。タブレットを別扱いにする必要がある場合は、クラスの isTablet() も利用できます。より広いモバイル判定を使う前に、タブレットの判定結果をレイアウトや機能にどう反映するか決めておきましょう。

この分類は、PHPが受け取ったリクエストに基づきます。ブラウザーのレスポンシブデザインモードでは、エミュレートする端末を変更すると異なるユーザーエージェントが送信されることがありますが、それによってすべての実機のスマートフォンやタブレットでの動作を確認できるわけではありません。ユーザーエージェントの値は変更できるため、クライアント検出をセキュリティや本人確認に使わないでください。

PHPで HTTP_USER_AGENT と preg_match() 関数を使ってモバイルデバイスを検出する

依存ライブラリを使わずに判定するには、$_SERVER スーパーグローバルから HTTP_USER_AGENT を読み取り、モバイルに関連する語句をいくつか照合します。このキーが存在しない場合もあるため、preg_match() を呼び出す前に文字列のデフォルト値を指定します。この例ではサンプルのiPhoneユーザーエージェント値を調べています。Webリクエストでは、PHPがリクエストヘッダーから値を受け取ります。

<?php
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)';
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
$pattern = '/(android|iphone|ipod|ipad|mobile|tablet)/i';
$isMobile = preg_match($pattern, $userAgent) === 1;

echo $isMobile ? 'Mobile device detected' : 'Mobile device not detected';

preg_match() は、一致した場合に 1、一致しない場合に 0、パターンを評価できない場合に false を返します。=== 1 で比較すると、一致した場合にだけ分岐します。実際のリクエストにヘッダーがない場合、デフォルト値は空文字列となり、このパターンでは非モバイル側の分岐になります。

この結果は大まかな分類として扱ってください。ユーザーエージェント文字列は存在しない場合や改変される場合があり、短い手動管理のパターンでは新しいクライアントや一般的でないクライアントを見落とすことがあります。リストを長くしても、すべてを網羅できる保証にはなりません。モバイル端末のユーザーエージェント文字列に関するStack Overflowの議論は、コミュニティが管理する参考情報です。アプリケーションに取り入れる前に、提案の内容を慎重に確認してください。