初級 PHP ユーザーエージェント 条件分岐

スマホかパソコンかを判定する

ブラウザが送ってくる「ユーザーエージェント」を PHP で調べて、スマホとパソコンで表示を変えます。PHP の配列・繰り返し・条件分岐の練習にもなります。

このサンプルは2017〜2018年ごろに作成したものです。PHPのバージョンが上がり、そのままでは動かなくなっていたため、2026年に PHP 8.3 で動くように書き直し、解説も新しくしました。

DEMO 実際に動かしてみよう

あなたは パソコン で見ています

パソコンなので、タイピング練習などキーボードを使うデモも楽しめます。(判定結果に合わせてメッセージを変える例)

ブラウザから送られてきたユーザーエージェント:

Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)

解説コードを読んでみよう

このサンプルでわかること

  • ユーザーエージェント(ブラウザの自己紹介の文字列)とは何か
  • PHP で $_SERVER['HTTP_USER_AGENT'] を読み取る方法
  • 配列と foreach、str_contains() を使った判定のしかた
  • 判定結果に合わせて HTML の表示を切り替える方法

使っているファイル

  • index.php判定(PHP)と表示(HTML)がすべてこの中

1. ユーザーエージェントを受け取る

ブラウザはページを開くとき、「自分は何のブラウザで、どんな端末か」という文字列をサーバーに送っています。これをユーザーエージェント(UA)といい、PHP では $_SERVER['HTTP_USER_AGENT'] で読めます。デモの下に表示しているのが、あなたのブラウザが送ってきた実際の文字列です。

index.php(1〜3行目) PHP
<?php
// スマホかどうかを判定する(ユーザーエージェントで判定)
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';   // ブラウザが送ってくる自己紹介の文字列

?? '' は「左側が存在しなければ右側(空文字)を使う」という意味です。ユーザーエージェントを送ってこない場合もあるので、こう書いておくと PHP 8 で警告が出ません。

2. スマホらしい文字が含まれているか調べる

iPhone や Android のユーザーエージェントには Mobile や Android という文字が入っています。そこで、目印になる文字を配列にまとめ、foreach で1つずつ「含まれているか」を調べます。

index.php(5〜14行目) PHP
// この文字が含まれていたらスマホ・タブレットとみなす
$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 と組み合わせるときに読みやすい書き方です。

index.php(25〜37行目) PHP
<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(メディアクエリ)を使う方法が今は主流です。

↑