解説コードを読んでみよう
このサンプルでわかること
- ユーザーエージェント(ブラウザの自己紹介の文字列)とは何か
- PHP で
$_SERVER['HTTP_USER_AGENT']を読み取る方法 - 配列と
foreach、str_contains()を使った判定のしかた - 判定結果に合わせて HTML の表示を切り替える方法
使っているファイル
- index.php判定(PHP)と表示(HTML)がすべてこの中
1. ユーザーエージェントを受け取る
ブラウザはページを開くとき、「自分は何のブラウザで、どんな端末か」という文字列をサーバーに送っています。これをユーザーエージェント(UA)といい、PHP では $_SERVER['HTTP_USER_AGENT'] で読めます。デモの下に表示しているのが、あなたのブラウザが送ってきた実際の文字列です。
<?php
// スマホかどうかを判定する(ユーザーエージェントで判定)
$ua = $_SERVER['HTTP_USER_AGENT'] ?? ''; // ブラウザが送ってくる自己紹介の文字列
?? '' は「左側が存在しなければ右側(空文字)を使う」という意味です。ユーザーエージェントを送ってこない場合もあるので、こう書いておくと PHP 8 で警告が出ません。
2. スマホらしい文字が含まれているか調べる
iPhone や Android のユーザーエージェントには Mobile や Android という文字が入っています。そこで、目印になる文字を配列にまとめ、foreach で1つずつ「含まれているか」を調べます。
// この文字が含まれていたらスマホ・タブレットとみなす
$mobile_words = ['Mobile', 'Android', 'Silk/', 'Kindle', 'BlackBerry', 'Opera Mini', 'Opera Mobi'];
$type = 'pc';
foreach ($mobile_words as $word) {
if (str_contains($ua, $word)) {
$type = 'mobile';
break;
}
}
- 最初に
$type = 'pc'(パソコン)としておきます。 - 目印の文字が1つでも見つかったら
'mobile'に変えて、breakでくり返しを終わります。
3. 判定結果で表示を変える
HTML の中で if を使うと、条件によって出す内容を変えられます。<?php if (...): ?> 〜 <?php else: ?> 〜 <?php endif; ?> の形は、HTML と組み合わせるときに読みやすい書き方です。
<div class="device <?= $type === 'mobile' ? 'device--mobile' : 'device--pc' ?>">
<div class="device__icon" aria-hidden="true"><?= $type === 'mobile' ? '📱' : '💻' ?></div>
<p class="device__result">あなたは <strong><?= $type === 'mobile' ? 'スマホ・タブレット' : 'パソコン' ?></strong> で見ています</p>
<?php if ($type === 'mobile'): ?>
<p class="alert alert-warning">スマホではキーボードを使うタイピング練習はできません。パソコンでアクセスしてください。(判定結果に合わせてメッセージを変える例)</p>
<?php else: ?>
<p class="alert alert-success">パソコンなので、タイピング練習などキーボードを使うデモも楽しめます。(判定結果に合わせてメッセージを変える例)</p>
<?php endif; ?>
</div>
<p>ブラウザから送られてきたユーザーエージェント:</p>
<pre><?= h($ua !== '' ? $ua : '(送られてきませんでした)') ?></pre>
ユーザーエージェントを画面に出すときは、必ず h()(htmlspecialchars)でエスケープします。ユーザーエージェントは利用者が自由に書き換えられるので、そのまま出すと悪意のある HTML やスクリプトを埋め込まれるおそれがあります。
PHP 8.3 で書き直したポイント
| 書き直す前 | 書き直した後 | 理由 |
|---|---|---|
strpos($ua, 'Mobile') !== false を7回 || でつなぐ | 配列+foreach+str_contains() | str_contains() は PHP 8 で追加された「含まれているか」を調べる関数で、読みやすくなります |
$_SERVER['HTTP_USER_AGENT'] をそのまま使用 | ?? '' を付ける | 送られてこないとき PHP 8 では警告になるため |
スマホなら alert() で警告 | 画面の中にメッセージを表示 | ポップアップは操作のじゃまになるため |
ユーザーエージェントでの判定は「だいたい分かる」程度のものです(iPad はパソコンと同じ UA を送ることがあります)。画面の幅で見た目を変えたいだけなら、CSS の @media(メディアクエリ)を使う方法が今は主流です。