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 を返します。予期せぬ結果にならないよう、空文字列のチェックも検討してください。

PHP8 str_starts_withでURLプロトコルを高速判定する

1<?php
2
3/**
4 * str_starts_with 関数のパフォーマンスに焦点を当てたサンプルコード。
5 *
6 * PHP 8 で導入された str_starts_with 関数は、文字列が特定のプレフィックスで始まるかを
7 * 効率的に判定するために最適化されています。従来の substr() 関数を用いた比較などと比べ、
8 * 内部的な処理が高速であるため、特に大量の文字列に対して繰り返しチェックを行う場合や、
9 * 非常に長い文字列を扱う場合にパフォーマンス上のメリットがあります。
10 *
11 * この関数は、文字列操作における一般的な処理を高速化することを目的としています。
12 */
13function checkUrlProtocolsWithStrStartsWith(): void
14{
15    // チェック対象となる様々なURL文字列の配列
16    $urls = [
17        'https://www.example.com/page1',
18        'http://blog.example.org',
19        'ftp://files.example.net/downloads',
20        'https://api.example.io/v1/users',
21        'www.example.com/about', // プロトコルなし
22        'HTTPS://CASE-SENSITIVE.COM', // str_starts_with は大文字小文字を区別する
23        'sftp://backup.example.com',
24        'http://localhost:8080',
25    ];
26
27    // 検索するセキュアなプロトコルのプレフィックス
28    $secureProtocol = 'https://';
29    // 検索する非セキュアなプロトコルのプレフィックス
30    $insecureProtocol = 'http://';
31
32    echo "--- URLプロトコルチェック (セキュア: '{$secureProtocol}', 非セキュア: '{$insecureProtocol}') ---\n\n";
33
34    foreach ($urls as $url) {
35        // str_starts_with を使用して、URLが 'https://' で始まるかチェックします。
36        // この関数は、substr() による手動比較よりもパフォーマンスが優れています。
37        if (str_starts_with($url, $secureProtocol)) {
38            echo "✅ '{$url}' はセキュアな ('{$secureProtocol}') プロトコルで始まります。\n";
39        } elseif (str_starts_with($url, $insecureProtocol)) {
40            echo "⚠️ '{$url}' は非セキュアな ('{$insecureProtocol}') プロトコルで始まります。\n";
41        } else {
42            echo "❌ '{$url}' は既知のプロトコル ('{$secureProtocol}'/'{$insecureProtocol}') で始まりません。\n";
43        }
44    }
45
46    echo "\nこのコード例は、str_starts_with が文字列のプレフィックス判定において、\n";
47    echo "PHP 8 以降で推奨される、パフォーマンスに優れた方法であることを示しています。\n";
48}
49
50// 関数を実行し、結果を出力
51checkUrlProtocolsWithStrStartsWith();
52

str_starts_with関数は、PHP 8で導入された便利な機能で、ある文字列が特定のプレフィックス(接頭辞)で始まるかどうかを効率的に判定するために使用されます。

この関数は、第一引数string $haystackに検索対象の文字列を、第二引数string $needleにその文字列の先頭にあるかを調べたいプレフィックス文字列を指定します。$haystack$needleで始まっている場合はtrue(真)を、そうでない場合はfalse(偽)をbool型の戻り値として返します。

特にこの関数は、従来のsubstr()関数などを用いた手動の比較処理よりも内部的に最適化されており、高いパフォーマンスを発揮します。そのため、大量の文字列に対して繰り返し先頭の一致をチェックする場合や、非常に長い文字列を扱う際に、処理速度の面で大きなメリットがあります。

サンプルコードでは、URLのリストを対象に、それぞれのURLがhttps://http://といったセキュアまたは非セキュアなプロトコルで始まるかをstr_starts_with関数を使って効率的に判別しています。これにより、URLの種類を迅速に特定できることが示されています。なお、この関数は大文字と小文字を区別して判定します。この機能は、文字列操作における一般的なタスクをより簡潔かつ高速に実現するため、PHP 8以降での利用が推奨されます。

このstr_starts_with関数はPHP 8で導入されたため、古いPHPバージョンでは使用できません。引数$haystack$needleはどちらも文字列型である必要があります。この関数は文字列の先頭が指定された文字列で始まるかを厳密に判定し、大文字小文字を区別することに注意してください。例えば「HTTPS」と「https」は異なるものとして扱われます。特に大量の文字列をチェックする場合や、ループ内で繰り返し利用する際に、従来のsubstr関数などを用いた方法よりも優れたパフォーマンスを発揮します。文字列の先頭判定を効率的に行うための現代的な方法として積極的に利用してください。

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を返すという仕様は、誤解しやすい点ですので注意が必要です。コードを安全かつ正しく利用するためには、これらのポイントを理解しておくことが重要です。

PHP: str_starts_with と strpos による文字列先頭チェック

1<?php
2
3/**
4 * 文字列が特定のプレフィックスで始まるかどうかをチェックする二つの方法を比較します。
5 * PHP 8で導入されたstr_starts_with関数と、それ以前から利用されているstrpos関数での実装例です。
6 *
7 * str_starts_withは直感的に「文字列がこれで始まるか?」を判断でき、簡潔で読みやすいコードになります。
8 * strposは文字列内で部分文字列が最初に見つかる位置を返すため、
9 * 先頭で見つかったかどうかを判断するには、厳密に0と比較する必要があります (=== 0)。
10 * 単に == 0 とすると、strposが「見つからなかった」場合に返すfalseも0と評価され、
11 * 意図しない結果になる可能性があるため注意が必要です。
12 */
13function compareStringPrefixChecks(): void
14{
15    $text = "Hello, PHP World!";
16    $prefix_match = "Hello";       // テキストの先頭に一致するプレフィックス
17    $prefix_no_match = "Goodbye";  // テキストの先頭に一致しないプレフィックス
18    $prefix_partial_match = "PHP"; // テキストの途中に存在するが先頭ではないプレフィックス
19    $prefix_empty = "";            // 空文字列プレフィックス
20
21    echo "--- str_starts_with() の使用例 (PHP 8以降推奨) ---" . PHP_EOL;
22
23    // 例1: プレフィックスが先頭に一致する場合
24    if (str_starts_with($text, $prefix_match)) {
25        echo "'{$text}' は '{$prefix_match}' で始まります。" . PHP_EOL; // 出力される
26    } else {
27        echo "'{$text}' は '{$prefix_match}' で始まりません。" . PHP_EOL;
28    }
29
30    // 例2: プレフィックスが先頭に一致しない場合
31    if (str_starts_with($text, $prefix_no_match)) {
32        echo "'{$text}' は '{$prefix_no_match}' で始まります。" . PHP_EOL;
33    } else {
34        echo "'{$text}' は '{$prefix_no_match}' で始まりません。" . PHP_EOL; // 出力される
35    }
36
37    // 例3: プレフィックスが途中にあり、先頭ではない場合
38    if (str_starts_with($text, $prefix_partial_match)) {
39        echo "'{$text}' は '{$prefix_partial_match}' で始まります。" . PHP_EOL;
40    } else {
41        echo "'{$text}' は '{$prefix_partial_match}' で始まりません。" . PHP_EOL; // 出力される
42    }
43
44    // 例4: 空文字列をプレフィックスとした場合
45    if (str_starts_with($text, $prefix_empty)) {
46        echo "'{$text}' は空文字列で始まります。" . PHP_EOL; // 出力される (str_starts_withは常にtrueを返す)
47    } else {
48        echo "'{$text}' は空文字列で始まりません。" . PHP_EOL;
49    }
50
51    echo PHP_EOL . "--- strpos() を使った同等のチェック例 (PHP 7以前の代替手段) ---" . PHP_EOL;
52
53    // 例1: プレフィックスが先頭に一致する場合
54    // strposは先頭で見つかると0を返す。=== 0 で厳密にチェック。
55    if (strpos($text, $prefix_match) === 0) {
56        echo "'{$text}' は '{$prefix_match}' で始まります。" . PHP_EOL; // 出力される
57    } else {
58        echo "'{$text}' は '{$prefix_match}' で始まりません。" . PHP_EOL;
59    }
60
61    // 例2: プレフィックスが先頭に一致しない場合
62    // strposは見つからない場合にfalseを返す。false === 0 は false。
63    if (strpos($text, $prefix_no_match) === 0) {
64        echo "'{$text}' は '{$prefix_no_match}' で始まります。" . PHP_EOL;
65    } else {
66        echo "'{$text}' は '{$prefix_no_match}' で始まりません。" . PHP_EOL; // 出力される
67    }
68
69    // 例3: プレフィックスが途中にあり、先頭ではない場合
70    // strposは "PHP" が見つかる位置 (8) を返す。8 === 0 は false。
71    if (strpos($text, $prefix_partial_match) === 0) {
72        echo "'{$text}' は '{$prefix_partial_match}' で始まります。" . PHP_EOL;
73    } else {
74        echo "'{$text}' は '{$prefix_partial_match}' で始まりません。" . PHP_EOL; // 出力される
75        echo "(strposの結果: " . var_export(strpos($text, $prefix_partial_match), true) . ")" . PHP_EOL;
76    }
77
78    // 例4: 空文字列をプレフィックスとした場合
79    // strposは空文字列の場合も0を返す。
80    if (strpos($text, $prefix_empty) === 0) {
81        echo "'{$text}' は空文字列で始まります。" . PHP_EOL; // 出力される
82    } else {
83        echo "'{$text}' は空文字列で始まりません。" . PHP_EOL;
84    }
85}
86
87// 関数を実行して結果を確認
88compareStringPrefixChecks();

PHPのstr_starts_with関数は、ある文字列が特定の別の文字列(プレフィックス)で始まるかどうかを簡潔に判定するためにPHP 8で導入されました。この関数は、検索対象となる元の文字列を$haystack、その先頭に存在するか確認したい文字列(プレフィックス)を$needleとして受け取ります。$haystack$needleで始まっていれば論理値のtrueを、そうでなければfalseを戻り値として返します。

これまで同様のチェックを行う際には、strpos関数を使って「strpos($haystack, $needle) === 0」のように記述するのが一般的でした。strposは部分文字列が見つかった位置を数値で返し、見つからない場合はfalseを返します。そのため、先頭で見つかったことを厳密に判定するには、0との型も含めた厳密な比較(===)が必要でした。str_starts_withはこのような複雑さを解消し、より直感的で読みやすいコードで文字列の開始をチェックできる利点があります。

サンプルコードでは、「Hello, PHP World!」という文字列を例に、str_starts_withstrposを使った様々なプレフィックス判定の挙動を比較しています。空文字列をプレフィックスとして与えた場合、str_starts_withは常にtrueを返しますが、strpos0を返すため、最終的な判定結果は同じtrueとなります。この関数は、文字列のプレフィックス判定をより簡潔かつ安全に行うための現代的な方法を提供します。

PHP 8以降ではstr_starts_with関数が推奨されます。これは文字列が特定のプレフィックスで始まるかを直感的に判断でき、戻り値が真偽値なので読みやすく安全です。空文字列をプレフィックスとした場合、常に真を返します。一方、strpos関数を使用する場合、文字列の先頭一致を判定するには、戻り値が厳密に0であるか(=== 0)を確認することが非常に重要です。緩やかな比較(== 0)を使うと、文字列が見つからなかった場合のfalse0と評価され、意図しない結果となるため特に注意してください。

関連コンテンツ

関連プログラミング言語