- 文字列が特定の文字で始まるかの判定は
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 ⭕ コピペで動く正解コード
<?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
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つのポイント
str_starts_with() で迷わず判定str_starts_with($文字列, $探す文字) は、先頭が一致すれば true、違えば false を返します。strpos() === 0 のような位置比較が不要になり、条件式の意図が一目で伝わります。
str_ends_with() で文字数計算をゼロにstr_ends_with($文字列, $探す文字) を使えば、-4 のような文字数指定なしで末尾の拡張子やスラッシュを判定できます。.jpg(4文字)から .jpeg(5文字)へ条件が変わっても、文字数を数え直す必要がありません。
strtolower() を併用これらの関数は .PDF と .pdf を別の文字として厳密に区別します。拡張子など大文字・小文字を問わず判定したい場合は、strtolower($url) で小文字に揃えてから判定しましょう。
4. 1分ミニチャレンジ
🚀 手を動かしてみよう
正解コードの配列 $links に大文字の拡張子 'https://example.com/MANUAL.PDF' を追加し、12行目の判定を if (str_ends_with(strtolower($url), '.pdf')) に書き換えて実行してみましょう。大文字の .PDF でも正しく「📄 安全なPDFダウンロードリンクです」と判定されることが確認できます。