[PHP] startsWith, endsWith を実装する

4 min read

Java で何の気なしに使っていた startsWith, endsWith
PHP で同様のことをしようと思ったのですが、これに相当するメソッドはないんですね。
そういえばpreg_matchとかでチェックしていたような覚えがあります。

そもそもstartsWith, endsWith とは

指定の文字列で始まる/終わるかを判定するメソッドです。

startsWith

public boolean **startsWith**(String prefix)
この文字列が、指定された接頭辞で始まるかどうかを判定します。
パラメータ:
`prefix` - 接頭辞
戻り値:
引数によって表される文字シーケンス、この文字列によって表される文字シーケンスの接頭辞である場合は `true`、そうでない場合は `false`。引数が空の文字列の場合や、`equals(Object)メソッドによる判定においてこの `String` オブジェクトに等しい場合にも `true` が返される
導入されたバージョン:
1. 0

endsWith

public boolean **endsWith**(String suffix)
この文字列が、指定された接尾辞で終るかどうかを判定します。
パラメータ:
`suffix` - 接尾辞
戻り値:
引数によって表される文字シーケンスが、このオブジェクトによって表される文字シーケンスの接尾辞である場合は `true`、そうでない場合は `false`。引数が空の文字列の場合や、`equals(Object)`メソッドによる判定においてこの `String` オブジェクトに等しい場合にも、結果は `true` になる

引用: String (Java Platform SE 6)

使い方

boolean result = str.startsWith("abc");
boolean result = str.endsWith("efg");

実装する

いろいろと試してみましたが以下の方法がシンプルな気がします。

function startsWith($haystack, $needle)
{
    return $needle === "" || strpos($haystack, $needle) === 0;
}
function endsWith($haystack, $needle)
{
    return $needle === "" || substr($haystack, -strlen($needle)) === $needle;
}

var_dump(startsWith("hello world", "hello")); // true
var_dump(endsWith("hello world", "world")); // true

引用: string - startsWith() and endsWith() functions in PHP - Stack Overflow

同ページ内で一番評価の高い方法は以下です。
やっていることはほぼほぼ同じようですね。こちらの方が何をやってるか分かりやすいかも。

function startsWith($haystack, $needle)
{
     $length = strlen($needle);
     return (substr($haystack, 0, $length) === $needle);
}

function endsWith($haystack, $needle)
{
    $length = strlen($needle);
    if ($length == 0) {
        return true;
    }

    return (substr($haystack, -$length) === $needle);
}