Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】str_starts_with()関数の使い方

str_starts_with関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

str_starts_with関数は、ある文字列が特定の文字列(プレフィックス、すなわち接頭辞)で始まっているかどうかを判別する関数です。この関数は、最初の引数として検査対象となる文字列(haystack)を、2番目の引数として検索したいプレフィックス文字列(needle)を受け取ります。もし検査対象の文字列が指定されたプレフィックスで始まっている場合、この関数は真偽値のtrueを返します。そうでない場合はfalseを返します。この比較は大文字と小文字を厳密に区別して行われます。

例えば、ウェブアプリケーションでユーザーがアップロードしたファイル名が「IMG_」で始まるかを確認したい場合や、URLが「https://」で始まるかを検証したい場合など、文字列の先頭部分を効率的にチェックする必要がある際に非常に役立ちます。この関数はPHP 8.0で新しく導入されたものであり、それ以前のバージョンでは利用できませんのでご注意ください。

以前は、同様の処理を行うためにsubstr()関数や正規表現などを用いる必要がありましたが、str_starts_with関数を使うことで、より直感的で読みやすく、かつ意図が明確なコードを書くことができるようになりました。システム開発において、特定の条件に基づいて処理を分岐させたり、入力データの整合性を検証したりする際など、文字列操作の多くの場面でその利便性を発揮します。この関数は、コードの簡潔さと可読性を向上させるための重要なツールの一つと言えるでしょう。

構文(syntax)

1<?php
2$haystack = "Hello, world!";
3$needle = "Hello";
4$result = str_starts_with($haystack, $needle);
5?>

引数(parameters)

string $haystack, string $needle

  • string $haystack: 検索対象の文字列
  • string $needle: 検索する文字列

戻り値(return)

bool

指定された文字列が、別の文字列で始まるかどうかを判定し、真偽値 (true または false) を返します。

サンプルコード

PHP str_starts_with で文字列の先頭を確認する

1<?php
2
3/**
4 * 文字列が指定された文字列で始まるかどうかを確認するサンプルコード
5 */
6function str_starts_with_example(): void
7{
8    $haystack = "This is a sample string.";
9    $needle1 = "This";
10    $needle2 = "That";
11
12    // $haystack が $needle1 で始まるか確認
13    if (str_starts_with($haystack, $needle1)) {
14        echo "'$haystack' は '$needle1' で始まります。\n";
15    } else {
16        echo "'$haystack' は '$needle1' で始まりません。\n";
17    }
18
19    // $haystack が $needle2 で始まるか確認
20    if (str_starts_with($haystack, $needle2)) {
21        echo "'$haystack' は '$needle2' で始まります。\n";
22    } else {
23        echo "'$haystack' は '$needle2' で始まりません。\n";
24    }
25}
26
27str_starts_with_example();

PHPのstr_starts_with関数は、ある文字列が指定された文字列で始まるかどうかを判定する関数です。PHP 8以降で使用できます。

この関数は、2つの引数を取ります。第一引数$haystackは、検索対象となる文字列です。第二引数$needleは、先頭に存在するかどうかを確認する文字列です。

サンプルコードでは、str_starts_with_example関数内で、$haystackという変数に"This is a sample string."という文字列を格納し、$needle1に"This"、$needle2に"That"という文字列を格納しています。

そして、str_starts_with関数を使って、$haystack$needle1または$needle2で始まるかどうかをそれぞれ確認しています。

str_starts_with($haystack, $needle1)は、$haystackが$needle1("This")で始まるため、trueを返します。結果として「'This is a sample string.' は 'This' で始まります。」と出力されます。

一方、str_starts_with($haystack, $needle2)は、$haystackが$needle2("That")で始まらないため、falseを返します。結果として「'This is a sample string.' は 'That' で始まりません。」と出力されます。

str_starts_with関数は、戻り値としてboolean型(trueまたはfalse)を返します。文字列の先頭一致を判定する際に非常に便利な関数です。

str_starts_with関数は、PHP 8 から導入された文字列関数です。第一引数 $haystack が、第二引数 $needle で始まるかどうかを判定します。大文字・小文字は区別されるため、注意が必要です。もし大文字・小文字を区別せずに比較したい場合は、strtolower 関数などで両方の文字列を小文字に変換してから比較してください。また、$needle が空文字列の場合、str_starts_with は常に true を返します。予期せぬ結果にならないよう、空文字列のチェックも検討してください。

PHP str_starts_with ポリフィルで文字列判定

1<?php
2
3// str_starts_with は PHP 8.0 で導入された関数です。
4// このコードは、PHP 8.0 未満の環境でこの関数が利用できない場合に、
5// 同等の機能を提供する「ポリフィル」と呼ばれるものです。
6// これにより、古いPHPバージョンでも str_starts_with を使用できるようになります。
7if (!function_exists('str_starts_with')) {
8    /**
9     * ある文字列が特定の文字列で始まるかどうかを判定します。
10     * PHP 8.0 未満のバージョン向けに提供される互換性関数(ポリフィル)です。
11     *
12     * @param string $haystack 検索対象となる元の文字列。
13     * @param string $needle   $haystackの先頭がこの文字列と一致するかどうかを検索します。
14     * @return bool            $haystackが$needleで始まる場合は true、そうでない場合は false を返します。
15     */
16    function str_starts_with(string $haystack, string $needle): bool
17    {
18        // 検索する文字列 ($needle) が空の場合、どのような文字列も空文字列で始まると見なされるため、trueを返します。
19        if ('' === $needle) {
20            return true;
21        }
22
23        // 検索対象の文字列 ($haystack) が検索する文字列 ($needle) より短い場合、
24        // $haystackが$needleで始まることは物理的に不可能です。
25        if (strlen($haystack) < strlen($needle)) {
26            return false;
27        }
28
29        // strncmp関数を使用して、$haystackの先頭から$needleの長さ分の文字と$needleを比較します。
30        // strncmpは、比較結果が等しい(つまり、指定された長さで文字列が一致する)場合に 0 を返します。
31        // この方法は、部分文字列を新しく生成する substr() などを使用するよりも、多くの場合で効率的です。
32        return 0 === strncmp($haystack, $needle, strlen($needle));
33    }
34}

str_starts_with関数は、PHP 8.0で新しく追加された便利な機能です。この関数は、ある文字列が特定の別の文字列で始まるかどうかをシンプルに判定します。

提供されたサンプルコードは、str_starts_with関数がPHP 8.0未満の環境で利用できない場合に、同等の機能を提供する「ポリフィル」と呼ばれるものです。これにより、古いPHPバージョンでも新しい関数と同じようにコードを記述できるようになります。if (!function_exists('str_starts_with'))という記述で、関数が存在しない場合にのみ、互換性のある関数が定義されます。

この関数は二つの引数を取ります。一つ目の $haystack は検索対象となる元の文字列です。二つ目の $needle は、$haystackの先頭がこの文字列と一致するかどうかを調べたい文字列です。関数は、$haystack$needleで始まる場合にtrueを、そうでない場合はfalseをブール値として返します。

ポリフィルの中では、まず $needle が空文字列の場合にtrueを返します。次に、$haystackの長さが$needleより短い場合は物理的に開始できないためfalseを返します。最後に、strncmp関数を使って$haystackの先頭から$needleの長さ分だけを$needleと比較します。strncmpは部分文字列を生成せずに効率的に比較できるため、このポリフィルではこの方法が採用されています。strncmpが0を返せば、二つの文字列は指定された長さで一致していることになります。

このコードは、PHP 8.0未満の環境でstr_starts_with関数を利用可能にする「ポリフィル」と呼ばれる互換性コードです。PHP 8.0以上の環境ではこの関数が標準で提供されているため、基本的にこのコードは不要ですが、含めても問題なく動作します。if (!function_exists('str_starts_with')) によって、関数が既に定義済みの場合でも重複定義エラーを回避できます。引数である元の文字列と検索文字列は必ず文字列型で渡してください。戻り値は真偽値です。特に、検索文字列が空の場合、元の文字列の内容にかかわらず常にtrueを返すという仕様は、誤解しやすい点ですので注意が必要です。コードを安全かつ正しく利用するためには、これらのポイントを理解しておくことが重要です。

関連コンテンツ

関連プログラミング言語