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

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

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

作成日: 更新日:

基本的な使い方

str_ends_with関数は、文字列が指定された接尾辞で終わっているかどうかを判定する関数です。この関数は、PHP 8.0.0で導入され、文字列の末尾が特定の部分文字列と一致するかどうかを簡単に確認できます。具体的には、str_ends_with(string $haystack, string $needle): boolという形式で使用します。$haystackは検索対象となる文字列であり、$needleは検索する接尾辞です。

関数は、$haystack$needleで終わる場合にtrueを返し、そうでない場合はfalseを返します。大文字小文字は区別されます。例えば、str_ends_with("Hello World", "World")trueを返しますが、str_ends_with("Hello World", "world")falseを返します。

この関数は、ファイル名やURLの拡張子をチェックする際、または特定の文字列で終わるデータを処理する際に役立ちます。以前は、substr関数やstrcmp関数などを組み合わせて同様の処理を行う必要がありましたが、str_ends_with関数を使用することで、より簡潔で可読性の高いコードを書くことができます。

例えば、ファイル名が.txtで終わるかどうかを判定する場合、str_ends_with($filename, ".txt")のように使用できます。これにより、初心者でも簡単に文字列の末尾をチェックする処理を実装できます。

構文(syntax)

1<?php
2$text = "PHPプログラミング";
3$suffix = "グラミング";
4
5// str_ends_with() は、最初の文字列が2番目の文字列で終わる場合に true を返します。
6if (str_ends_with($text, $suffix)) {
7    echo "'{$text}' は '{$suffix}' で終わります。\n"; // この行が出力される
8} else {
9    echo "'{$text}' は '{$suffix}' で終わりません。\n";
10}
11?>

引数(parameters)

string $haystack, string $needle

  • string $haystack: haystack(検索対象の文字列)を指定します。
  • string $needle: needle(検索する文字列)を指定します。

戻り値(return)

bool

指定された文字列が、指定されたサフィックス(末尾の文字列)で終わるかどうかを真偽値(trueまたはfalse)で返します。

サンプルコード

PHP 8 str_ends_with で文字列の終端を判定する

1<?php
2
3/**
4 * 文字列が特定の文字列で終わるかどうかを判定するサンプルコード
5 */
6function strEndsWithExample(): void
7{
8    $haystack = "Hello World";
9    $needle1 = "World";
10    $needle2 = "hello";
11
12    // $haystack が $needle1 で終わるか確認
13    if (str_ends_with($haystack, $needle1)) {
14        echo "'$haystack' は '$needle1' で終わります。\n";
15    } else {
16        echo "'$haystack' は '$needle1' で終わりません。\n";
17    }
18
19    // $haystack が $needle2 で終わるか確認
20    if (str_ends_with($haystack, $needle2)) {
21        echo "'$haystack' は '$needle2' で終わります。\n";
22    } else {
23        echo "'$haystack' は '$needle2' で終わりません。\n";
24    }
25
26    $haystackArray = ["apple.txt", "banana.pdf", "orange.txt"];
27
28    foreach ($haystackArray as $filename) {
29        if (str_ends_with($filename, ".txt")) {
30            echo "'$filename' は '.txt' で終わります。\n";
31        } else {
32            echo "'$filename' は '.txt' で終わりません。\n";
33        }
34    }
35}
36
37strEndsWithExample();

PHP 8のstr_ends_with関数は、文字列が指定した文字列で終わるかどうかを判定する関数です。システムエンジニアを目指す方が文字列処理を理解する上で役立ちます。

この関数は、第一引数 $haystack に検索対象の文字列、第二引数 $needle に末尾に存在するかどうかを確認したい文字列を指定します。str_ends_with($haystack, $needle)のように記述し、$haystack$needle で終わる場合は true を、そうでない場合は false を返します。戻り値はboolean型(真偽値)です。大文字小文字は区別されます。

サンプルコードでは、まず文字列 "Hello World" が "World" で終わるかどうかを判定しています。str_ends_with("Hello World", "World")true を返すため、「'Hello World' は 'World' で終わります。」と表示されます。次に、"Hello World" が "hello" で終わるかどうかを判定しています。こちらは大文字小文字が異なるため false を返し、「'Hello World' は 'hello' で終わりません。」と表示されます。

また、文字列の配列をループ処理し、各要素(ファイル名)が ".txt" で終わるかどうかを判定する例も示しています。str_ends_with関数を用いることで、ファイルの種類を判定したり、特定の拡張子を持つファイルを選別する処理などを簡単に実装できます。

str_ends_with関数は、PHP 8以降で使用可能です。PHP 7以前のバージョンでは動作しないため注意が必要です。引数の順番は $haystack(検索対象の文字列)が先、$needle(検索する文字列)が後です。引数の型が違う場合、PHPが自動で型変換を試みますが、意図しない結果になる可能性があるため、両方とも文字列型にすることを推奨します。大文字小文字は区別されるため、"World""world"`は異なる文字列として扱われます。配列の要素に対して繰り返し処理を行う際にも活用できます。この関数は文字列の末尾が特定の部分文字列と一致するかどうかを判定するのみで、文字列自体を変更することはありません。

PHPで大文字小文字を区別せずに文字列の末尾を確認する

1<?php
2
3/**
4 * 文字列が、大文字小文字を区別せずに特定の文字列で終わるかどうかを確認する
5 *
6 * @param string $haystack 検索対象の文字列
7 * @param string $needle   末尾にあるか確認する文字列
8 *
9 * @return bool 大文字小文字を区別せずに $haystack が $needle で終わる場合は true、そうでない場合は false
10 */
11function str_ends_with_case_insensitive(string $haystack, string $needle): bool
12{
13    $haystack_len = strlen($haystack);
14    $needle_len = strlen($needle);
15
16    // needle が haystack より長い場合は、false を返す
17    if ($needle_len > $haystack_len) {
18        return false;
19    }
20
21    // 大文字小文字を区別せずに比較
22    return strcasecmp(substr($haystack, $haystack_len - $needle_len), $needle) === 0;
23}
24
25// 使用例
26$string = "Hello World";
27
28// 大文字小文字を区別しない比較
29if (str_ends_with_case_insensitive($string, "world")) {
30    echo "'$string' は 'world' (大文字小文字を区別しない) で終わります。\n";
31} else {
32    echo "'$string' は 'world' (大文字小文字を区別しない) で終わりません。\n";
33}
34
35if (str_ends_with_case_insensitive($string, "World")) {
36    echo "'$string' は 'World' (大文字小文字を区別しない) で終わります。\n";
37} else {
38    echo "'$string' は 'World' (大文字小文字を区別しない) で終わりません。\n";
39}

PHPのstr_ends_with関数は、PHP 8から導入された文字列関数で、ある文字列が特定の文字列で終わるかどうかを判定します。引数$haystackには検索対象の文字列、$needleには末尾にあるか確認したい文字列を指定します。戻り値はbool型で、$haystack$needleで終わる場合はtrue、そうでない場合はfalseを返します。

サンプルコードでは、大文字小文字を区別せずに文字列の末尾が特定の文字列と一致するかを判定するstr_ends_with_case_insensitive関数を定義しています。この関数は、$haystack$needleの長さを比較し、$needle$haystackよりも長い場合はfalseを返します。次に、substr関数で$haystackの末尾から$needleの長さ分の文字列を抽出し、strcasecmp関数を使って$needleと大文字小文字を区別せずに比較します。strcasecmp関数は、二つの文字列が等しい場合に0を返すため、結果が0である場合にtrueを返します。

例として、"Hello World"という文字列が"world"または"World"で終わるかどうかを判定しています。str_ends_with_case_insensitive関数を使用することで、大文字小文字の違いを気にせずに末尾が一致するかどうかを確認できます。この関数は、ユーザーからの入力値を検証する際など、大文字小文字を区別する必要がない場合に便利です。

str_ends_with関数は大文字小文字を区別するため、区別せずに比較したい場合は、サンプルコードのように自作関数が必要です。strcasecmp関数は、大文字小文字を区別せずに文字列を比較する関数です。また、substr関数で末尾部分を切り出す際、$haystackの長さから$needleの長さを引いた位置から切り出す必要がある点に注意してください。$needle$haystackより長い場合は、必ずfalseを返すように実装することで、予期せぬエラーを防ぐことができます。自作関数を使用する際は、引数の型を明示的に指定することで、より安全なコードになります。

PHP str_ends_with の動作とよくある誤解

1<?php
2
3/**
4 * str_ends_with() 関数の様々な挙動をデモンストレーションします。
5 *
6 * この関数はPHP 8で導入され、文字列が特定のサフィックスで終わるかを確認します。
7 * "php str_ends_with not working" という問題に直面する初心者は、
8 * 大文字・小文字の区別、空文字列の扱い、または引数の長さの誤解が原因である可能性があります。
9 * このコードは、これらの一般的な誤解を解消するための具体例を提供します。
10 */
11function demonstrateStrEndsWithUsage(): void
12{
13    echo "--- str_ends_with() のデモンストレーションとよくある誤解 ---" . PHP_EOL . PHP_EOL;
14
15    // ケース1: 基本的な成功例
16    $haystack1 = "Hello PHP World";
17    $needle1 = "World";
18    echo "1. '{$haystack1}' が '{$needle1}' で終わるか?" . PHP_EOL;
19    var_dump(str_ends_with($haystack1, $needle1)); // 期待値: true
20    echo PHP_EOL;
21
22    // ケース2: 基本的な失敗例
23    $haystack2 = "Hello PHP World";
24    $needle2 = "PHP";
25    echo "2. '{$haystack2}' が '{$needle2}' で終わるか?" . PHP_EOL;
26    var_dump(str_ends_with($haystack2, $needle2)); // 期待値: false
27    echo PHP_EOL;
28
29    // ケース3: 大文字・小文字の区別 (「not working」と誤解されやすいポイント)
30    // str_ends_with() は大文字・小文字を区別します。
31    $haystack3 = "Hello world";
32    $needle3 = "World"; // 大文字の 'W'
33    echo "3. '{$haystack3}' が '{$needle3}' で終わるか? (大文字・小文字区別)" . PHP_EOL;
34    var_dump(str_ends_with($haystack3, $needle3)); // 期待値: false
35    echo "   補足: str_ends_with() は大文字・小文字を区別するため、この場合は一致しません。" . PHP_EOL . PHP_EOL;
36
37    // ケース4: 空文字列を $needle に指定した場合 (「not working」と誤解されやすいポイント)
38    // PHPの str_ends_with() は、空文字列で終わることを常に true と判断します。
39    $haystack4 = "Any string";
40    $needle4 = "";
41    echo "4. '{$haystack4}' が空文字列 '' で終わるか?" . PHP_EOL;
42    var_dump(str_ends_with($haystack4, $needle4)); // 期待値: true
43    echo "   補足: str_ends_with() は空文字列で終わることを常に true と判断します。" . PHP_EOL . PHP_EOL;
44
45    // ケース5: $needle が $haystack よりも長い場合 (「not working」と誤解されやすいポイント)
46    // str_ends_with() は、$needle が $haystack よりも長い場合、常に false を返します。
47    // ただし、$needle が空文字列の場合は除きます (ケース4)。
48    $haystack5 = "Hi";
49    $needle5 = "Hello";
50    echo "5. '{$haystack5}' が '{$needle5}' で終わるか? ($needle が長い)" . PHP_EOL;
51    var_dump(str_ends_with($haystack5, $needle5)); // 期待値: false
52    echo "   補足: $needle$haystack より長い場合は、false となります。" . PHP_EOL . PHP_EOL;
53
54    // ケース6: $haystack 自体が $needle と同じ文字列の場合
55    $haystack6 = "test";
56    $needle6 = "test";
57    echo "6. '{$haystack6}' が '{$needle6}' で終わるか? ($haystack == $needle)" . PHP_EOL;
58    var_dump(str_ends_with($haystack6, $needle6)); // 期待値: true
59    echo PHP_EOL;
60
61    // ケース7: $haystack が空文字列の場合
62    $haystack7 = "";
63    $needle7 = "something";
64    echo "7. 空文字列 '' が '{$needle7}' で終わるか?" . PHP_EOL;
65    var_dump(str_ends_with($haystack7, $needle7)); // 期待値: false
66    echo PHP_EOL;
67
68    // ケース8: $haystack も $needle も空文字列の場合
69    $haystack8 = "";
70    $needle8 = "";
71    echo "8. 空文字列 '' が空文字列 '' で終わるか?" . PHP_EOL;
72    var_dump(str_ends_with($haystack8, $needle8)); // 期待値: true (ケース4と同様の理由)
73    echo PHP_EOL;
74}
75
76// 関数を実行し、str_ends_with() の動作を確認します。
77demonstrateStrEndsWithUsage();

PHP 8で導入されたstr_ends_with関数は、指定した文字列の末尾が別の特定の文字列と一致するかどうかを判定するために利用されます。この関数は、検査対象の文字列を$haystack、末尾に存在するかを確認したい文字列を$needleとして受け取ります。一致する場合はtrueを、一致しない場合はfalseを真偽値(bool)で返します。

システム開発において、ファイルの拡張子チェックや特定のURLの末尾判定など、様々な場面で活用できますが、初心者が「php str_ends_with not working」と感じる原因として、いくつかの注意点があります。第一に、この関数は大文字・小文字を厳密に区別します。例えば、「Hello World」が「world」で終わるかを確認すると、大文字・小文字が異なるためfalseとなります。第二に、$needleに空文字列""を指定した場合、どのような$haystackに対しても常にtrueを返します。第三に、$needle$haystackよりも長い場合、空文字列の場合を除き、結果はfalseとなります。これらの特性を理解することで、正確な文字列処理を行い、予期せぬ挙動を避けることができます。

PHP 8以降で利用可能なstr_ends_with関数は、文字列の末尾が特定の文字列と一致するかを判断します。この関数は大文字・小文字を厳密に区別するため、大文字と小文字が異なる場合は一致しませんのでご注意ください。また、検索する文字列($needle)が空の場合、常にtrueを返します。対象の文字列($haystack)よりも検索する文字列が長い場合も、結果はfalseとなります。これらの特性を理解して利用することで、「not working」と感じる一般的な誤解を避け、安全かつ正確にコードを利用できます。

PHP str_ends_with 関数ポリフィルで文字列の末尾を判定する

1<?php
2
3// PHP 8以降では `str_ends_with` 関数が組み込みで提供されています。
4// このコードは、PHP 7.x などの古いバージョンで `str_ends_with` 関数を使用できるようにするための「ポリフィル」です。
5// ポリフィルとは、新しい環境の機能を古い環境でも利用できるようにするコードのことです。
6if (!function_exists('str_ends_with')) {
7    /**
8     * 指定された文字列が特定の文字列で終わるかどうかをテストします。
9     *
10     * @param string $haystack 検索対象の文字列。
11     * @param string $needle   $haystackの末尾で検索する文字列。
12     * @return bool            $haystackが$needleで終わる場合はtrue、そうでない場合はfalse。
13     */
14    function str_ends_with(string $haystack, string $needle): bool
15    {
16        // 検索する文字列 ($needle) が空の場合、すべての文字列は空文字列で終わると見なします。
17        if ('' === $needle) {
18            return true;
19        }
20
21        // 検索対象の文字列 ($haystack) が、検索する文字列 ($needle) より短い場合、
22        // $needle で終わることはあり得ません。
23        if (strlen($haystack) < strlen($needle)) {
24            return false;
25        }
26
27        // $haystackの末尾から$needleと同じ長さの部分文字列を抽出し、
28        // それが$needleと完全に一致するかどうかを比較します。
29        // `substr` はバイト単位で処理するため、UTF-8などのマルチバイト文字でもPHPの
30        // `str_ends_with` 組み込み関数と同様の動作をします。
31        return substr($haystack, -strlen($needle)) === $needle;
32    }
33}
34
35// -------------------------------------------------------------------------
36// 以下は、上記の `str_ends_with` 関数(または組み込み関数)の動作を確認するサンプルコードです。
37// -------------------------------------------------------------------------
38
39echo "--- str_ends_with 関数の動作確認 ---\n";
40
41// ケース1: 検索対象が終了文字列で終わる場合
42echo 'str_ends_with("Hello World", "World") returns: ';
43var_dump(str_ends_with("Hello World", "World")); // 期待値: true
44
45// ケース2: 検索対象が終了文字列で終わらない場合 (大文字小文字を区別)
46echo 'str_ends_with("Hello World", "world") returns: ';
47var_dump(str_ends_with("Hello World", "world")); // 期待値: false
48
49// ケース3: 検索する文字列が空の場合 (常にtrueを返す)
50echo 'str_ends_with("Hello World", "") returns: ';
51var_dump(str_ends_with("Hello World", ""));     // 期待値: true
52
53// ケース4: 検索対象の文字列が、検索する文字列よりも短い場合
54echo 'str_ends_with("php", "language") returns: ';
55var_dump(str_ends_with("php", "language"));     // 期待値: false
56
57// ケース5: 検索対象と検索する文字列が完全に一致する場合
58echo 'str_ends_with("PHP", "PHP") returns: ';
59var_dump(str_ends_with("PHP", "PHP"));         // 期待値: true
60
61// ケース6: マルチバイト文字の例 (PHPの組み込み関数と同様にバイト単位で比較されます)
62echo 'str_ends_with("こんにちは世界", "世界") returns: ';
63var_dump(str_ends_with("こんにちは世界", "世界")); // 期待値: true (UTF-8の場合)
64
65echo 'str_ends_with("こんにちは世界", "日本") returns: ';
66var_dump(str_ends_with("こんにちは世界", "日本")); // 期待値: false

PHPのstr_ends_with関数は、ある文字列が特定の文字列で終わるかどうかを判定するものです。PHP 8以降で標準提供されていますが、古いバージョンでも利用できるよう「ポリフィル」が提供されています。

引数$haystackには検査対象の文字列を、$needleには末尾で一致するか確認したい文字列を指定します。関数は、$haystack$needleで終わっていればtrueを、そうでなければfalsebool型で返します。

$needleが空文字列の場合は常にtrueを、$haystack$needleより短い場合はfalseを返します。比較は大文字小文字を区別し、マルチバイト文字もバイト単位で処理されます。この関数は、ファイル拡張子のチェックやURLパスの判定など、文字列の末尾確認に役立ちます。

このサンプルコードは、主にPHP 7.xなどの古いバージョンでstr_ends_with関数を使用可能にするための「ポリフィル」です。PHP 8以降の環境では、すでに組み込み関数が存在するため、このポリフィルは実行されずに組み込み関数が自動的に利用されます。初心者が古いバージョンと新しいバージョンの両方で安全にコードを実行するための工夫と理解してください。

関数の動作としては、大文字と小文字を区別して文字列の末尾を比較します。検索する文字列が空の場合、常にtrueを返します。また、マルチバイト文字を含む文字列に対しても、PHPの組み込み関数と同様にバイト単位で比較処理が行われます。これはPHPの文字列関数の基本的な挙動ですが、文字数ではなくバイト数での判断となるため、特に日本語などのマルチバイト文字を扱う際には意図通りの結果になるか確認が必要です。

関連コンテンツ

関連プログラミング言語