💡 今日の3行まとめ
  • 文字列が特定の文字で始まるかの判定は strpos() ではなく str_starts_with() を使う
  • 特定の文字(拡張子など)で終わるかの判定は substr() ではなく str_ends_with() を使う
  • 大文字・小文字は厳密に区別されるため、拡張子チェックでは必要に応じて strtolower() と組み合わせる

1. 今日のお題とゴール

入力されたURLリストをチェックし、「安全な通信(https:// 始まり)か」と「PDFファイル(.pdf 終わり)か」を判定して振り分ける処理を作ります。

  • https:// で始まらないURLはエラーメッセージを返す
  • https:// で始まり、かつ末尾が .pdf の場合はPDFリンクとして案内する
  • それ以外の https:// リンクは通常のWebページリンクとして案内する
// 期待する出力結果
https://example.com/guide.pdf
 -> 📄 安全なPDFダウンロードリンクです
https://example.com/about
 -> 🔗 安全なWebページリンクです
http://example.com/guide.pdf
 -> ⚠️ エラー: https:// から始まるURLを指定してください

2. ❌ やりがちなNGコード vs ⭕ コピペで動く正解コード

❌ やりがちなNGコードBefore
<?php
$url = 'https://example.com/guide.pdf';

// ❌ 1. 先頭(0文字目)で見つかると strpos() は 0 を返すため、if文で false 扱いになる!
if (strpos($url, 'https://')) {
    echo "安全なURLです\n";
}

// ❌ 2. 切り出す文字数(-4)を直接書くと、条件変更時に数え間違いのバグが起きやすい
if (substr($url, -4) === '.pdf') {
    echo "PDFファイルです\n";
}

strpos() は先頭(0番目)で一致すると数値の 0 を返すため、=== 0 を忘れると「見つからなかった」と誤判定されます。また、substr() で末尾の文字数を直接指定する書き方は、文字数の数え間違いによるバグの温床になります。

⭕ コピペで動く正解コード(PHP 8.3+)After
<?php
declare(strict_types=1);

function checkDownloadUrl(string $url): string
{
    // 1. 先頭が「https://」で始まるかを直感的に判定
    if (!str_starts_with($url, 'https://')) {
        return '⚠️ エラー: https:// から始まるURLを指定してください';
    }

    // 2. 末尾が「.pdf」で終わるかを文字数計算なしで判定
    if (str_ends_with($url, '.pdf')) {
        return '📄 安全なPDFダウンロードリンクです';
    }

    return '🔗 安全なWebページリンクです';
}

$links = [
    'https://example.com/guide.pdf',
    'https://example.com/about',
    'http://example.com/guide.pdf',
];

foreach ($links as $link) {
    echo "{$link}\n -> " . checkDownloadUrl($link) . "\n";
}

3. ここだけ押さえる!3つのポイント

1先頭一致は str_starts_with() で迷わず判定

str_starts_with($文字列, $探す文字) は、先頭が一致すれば true、違えば false を返します。strpos() === 0 のような位置比較が不要になり、条件式の意図が一目で伝わります。

2末尾一致は str_ends_with() で文字数計算をゼロに

str_ends_with($文字列, $探す文字) を使えば、-4 のような文字数指定なしで末尾の拡張子やスラッシュを判定できます。.jpg(4文字)から .jpeg(5文字)へ条件が変わっても、文字数を数え直す必要がありません。

3大文字・小文字を区別したくないときは strtolower() を併用

これらの関数は .PDF と .pdf を別の文字として厳密に区別します。拡張子など大文字・小文字を問わず判定したい場合は、strtolower($url) で小文字に揃えてから判定しましょう。

4. 1分ミニチャレンジ

🚀 手を動かしてみよう

正解コードの配列 $links に大文字の拡張子 'https://example.com/MANUAL.PDF' を追加し、12行目の判定を if (str_ends_with(strtolower($url), '.pdf')) に書き換えて実行してみましょう。大文字の .PDF でも正しく「📄 安全なPDFダウンロードリンクです」と判定されることが確認できます。