PHPで前方一致を判定する方法|str_starts_withとstrposの使い分け

by

カテゴリー:

PHPで「前方一致」を判定したい、つまりある文字列が特定の文字列で始まっているかを確認したい場面はよくあります。この記事では、すぐ使えるサンプルコードから、str_starts_with()strpos() の使い分け、PHPのバージョン別の書き方までを初心者向けに整理します。

すぐ使える前方一致のサンプルコード

まずは結論から。PHP 8.0以降なら str_starts_with() を使うのが最もシンプルで読みやすい方法です。

<?php
$string = "https://example.com/blog";
$prefix = "https://";

// PHP 8.0以降: 前方一致かどうかを true / false で返す
if (str_starts_with($string, $prefix)) {
    echo "'{$prefix}' で前方一致します。\n";
} else {
    echo "'{$prefix}' では始まっていません。\n";
}

PHP 7以前の環境では str_starts_with() が使えないため、strpos() で先頭位置を確認します。

<?php
$string = "https://example.com/blog";
$prefix = "https://";

// PHP 7以前: 先頭(位置0)に一致するかを厳密比較で確認する
if (strpos($string, $prefix) === 0) {
    echo "'{$prefix}' で前方一致します。\n";
} else {
    echo "'{$prefix}' では始まっていません。\n";
}

以降で、それぞれの方法の詳細と注意点を解説します。

PHP 8.0以降: str_starts_with() を使う

PHP 8.0で追加された str_starts_with() 関数は、まさに「前方一致の判定」のための関数です。第1引数の文字列が第2引数で始まっていれば true、そうでなければ false を返します。

<?php
var_dump(str_starts_with("こんにちは世界", "こん")); // bool(true)
var_dump(str_starts_with("こんにちは世界", "世界")); // bool(false)

戻り値が最初から真偽値なので、strpos() のように「位置が0かどうか」を気にする必要がなく、条件式がそのまま読める形になります。PHP 8.0以降を利用できる環境であれば、前方一致にはこの関数を第一候補にしてください。

なお、大文字小文字を区別せずに判定したい場合は、両者を strtolower() でそろえてから比較します。

<?php
$string = "HTTPS://example.com";
$prefix = "https://";

if (str_starts_with(strtolower($string), strtolower($prefix))) {
    echo "大文字小文字を無視して前方一致します。\n";
}

PHP 7以前: strpos() で判定する

str_starts_with() が使えないPHP 7以前の環境では、strpos() 関数を使います。strpos() は、対象文字列の中で指定した文字列が最初に現れる位置を返す関数です。前方一致は「その位置が先頭(0)であること」で判定します。

<?php
$string = "こんにちは世界";
$prefix = "こん";

$position = strpos($string, $prefix);

if ($position === 0) {
    echo "文字列は '{$prefix}' で前方一致します。\n";
} else {
    echo "文字列は '{$prefix}' で前方一致しません。\n";
}

ここで最も重要なのは、比較に必ず ===(厳密比較)を使うことです。strpos() は文字列が見つからない場合に false を返しますが、先頭で見つかった場合は 0 を返します。==! による判定では false0 を区別できず、意図しない結果になります。

<?php
// NG: 先頭一致(0)も「見つからない(false)」も両方 false 扱いになる
if (strpos($string, $prefix) == false) { /* ... */ }

// OK: 位置が 0 かどうかを型まで含めて厳密に比較する
if (strpos($string, $prefix) === 0) { /* ... */ }

strpos() は大文字と小文字を区別します。区別せずに一致を確認したい場合は、代わりに stripos() 関数を使用してください(使い方は strpos() と同じで、戻り値の判定も同様に === 0 で行います)。

str_starts_with()strpos() の使い分け

どちらを使うべきかは、動作環境のPHPバージョンと目的で判断します。

関数対応バージョン戻り値向いている用途
str_starts_with()PHP 8.0以降bool前方一致の判定そのもの。まずこれを検討する
strpos()全バージョンint または falsePHP 7以前の環境、または一致位置も知りたい場合
  • PHP 8.0以降で「始まっているか」だけを知りたい → str_starts_with()。真偽値が返るので判定ミスが起きにくい。
  • PHP 7以前をサポートする必要がある → strpos($str, $prefix) === 0=== による厳密比較を忘れない。
  • 一致した「位置」も後続処理で使いたい → strpos()。位置を返す特性を活かせる。
  • 複雑なパターン(数字始まり、複数候補など)で判定したい → 後述の正規表現。

PHP 7以前も動かしつつ、PHP 8以降では読みやすさを優先したい場合は、function_exists() でフォールバックを用意する方法もあります。

<?php
function startsWith(string $string, string $prefix): bool
{
    if (function_exists('str_starts_with')) {
        return str_starts_with($string, $prefix);
    }
    return strpos($string, $prefix) === 0;
}

正規表現で前方一致を判定する

固定の文字列ではなく、より複雑なパターン(例: 「数字で始まる」「特定の複数語のいずれかで始まる」)で判定したい場合は、preg_match() 関数と正規表現を使います。^ アンカーを使って、文字列の先頭からの一致を指定します。

<?php
$string = "こんにちは世界";
$pattern = "/^こん/";

if (preg_match($pattern, $string)) {
    echo "前方一致しました。\n";
} else {
    echo "マッチしません。\n";
}

ただし、単純に「特定の文字列で始まるか」を確認したいだけであれば、正規表現よりも str_starts_with()strpos() のほうが高速で読みやすくなります。正規表現は柔軟なパターンが必要なときに使い分けましょう。

まとめ

PHPで前方一致を判定する方法を整理すると、次のようになります。

  • PHP 8.0以降なら str_starts_with() が最もシンプルで読みやすい。
  • PHP 7以前は strpos($str, $prefix) === 0。厳密比較 === を必ず使う。
  • 大文字小文字を無視するなら stripos()strtolower() を併用する。
  • 複雑なパターンには preg_match() と正規表現を使う。

使用するPHPのバージョンと目的に応じて、最適な方法を選択してください。

ホーム » 記事一覧 » apache » PHPで前方一致を判定する方法|str_starts_withとstrposの使い分け

投稿者

ここまで読んでいただき、ありがとうございます。

このサイトでは、私自身が関わっていることや、興味を持って試していることをそのまま置いています。

内容を見ていて、
「少し話を聞いてみたい」
「協業できる部分がありそう」
と感じる点があれば、下記のお問い合わせフォームからご連絡ください。状況を確認したうえで、必要な範囲でお返事します。

特に、以下のWordPressサイトに関する相談にも対応しているのでご興味ありましたらご相談ください。


Comments

“PHPで前方一致を判定する方法|str_starts_withとstrposの使い分け” への1件のフィードバック

  1. […] なお、行単位の差分表示までは必要なく、2つの文字列がどれくらい似ているかを数値で知りたいだけであれば、PHP標準の similar_text(一致する文字数と一致率を取得)や levenshtein(編集距離を取得)でライブラリなしに対応できます。単純に前方一致・部分一致で判定したいだけの場合は、PHPで前方一致を判定する方法(str_starts_withとstrposの使い分け)もあわせて確認してみてください。 […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です