web-dev-qa-db-ja.com

PHP文字列が別の文字列で終わるかどうかの最も効率的なテストは何ですか?

標準のPHP=文字列$strが部分文字列$testで終わるかどうかをテストする方法は次のとおりです。

$endsWith = substr( $str, -strlen( $test ) ) == $test

これが最速の方法ですか?

116
Jason Cohen

アサフが言ったことは正しい。 PHPには正確にそれを行うための組み込み関数があります。

substr_compare($str, $test, strlen($str)-strlen($test), strlen($test)) === 0;

$test$strより長い場合、PHPは警告を出します。そのため、最初に確認する必要があります。

function endswith($string, $test) {
    $strlen = strlen($string);
    $testlen = strlen($test);
    if ($testlen > $strlen) return false;
    return substr_compare($string, $test, $strlen - $testlen, $testlen) === 0;
}
143
mcrumley

この方法は、少しメモリを消費しますが、高速です。

stripos(strrev($haystack), $reversed_needle) === 0;

これは、針が何であるかを正確に知っている場合に最適であるため、針を逆にハードコーディングできます。プログラムで針を逆にすると、以前の方法よりも遅くなります。

66
jscheel
$endsWith = substr_compare( $str, $test, -strlen( $test ) ) === 0

負のオフセットは「文字列の終わりからカウントを開始します」。

50

文字列が見つかるはずの場所にstrposのオフセットを与えることにより、ある文字列が別の文字列で終わるかどうかを確認する簡単な方法を次に示します。

function stringEndsWith($whole, $end)
{
    return (strpos($whole, $end, strlen($whole) - strlen($end)) !== false);
}

簡単で、これはPHP 4。

11
Patrick Smith

それはあなたが気にする効率の種類に依存します。

あなたのバージョンは、substrの使用からの余分なコピーのためにより多くのメモリを使用します。

別のバージョンでは、コピーを作成せずに部分文字列の最後の出現を元の文字列で検索する場合がありますが、テストが増えるため、おそらく低速になります。

おそらく最も効率的な方法は、-sterlen(test)位置から文字列の終わりまで文字ごとにループを実行し、比較することです。これは、あなたが望んでいる最小限の比較であり、余分なメモリはほとんど使用されていません。

9
Assaf Lavie

別の方法は、 strrpos function を使用することです。

strrpos($str, $test) == strlen($str) - strlen($test)

しかし、それは速くありません。

5
Gumbo

以下の答えが効率的でシンプルであることを願っています:

$content = "The main string to search";
$search = "search";
//For compare the begining string with case insensitive. 
if(stripos($content, $search) === 0) echo 'Yes';
else echo 'No';

//For compare the begining string with case sensitive. 
if(strpos($content, $search) === 0) echo 'Yes';
else echo 'No';

//For compare the ending string with case insensitive. 
if(stripos(strrev($content), strrev($search)) === 0) echo 'Yes';
else echo 'No';

//For compare the ending string with case sensitive. 
if(strpos(strrev($content), strrev($search)) === 0) echo 'Yes';
else echo 'No';
3
Srinivasan.S

正規表現で確認する最も簡単な方法

たとえば指定したメールがgmailかどうかを確認するには:

echo (preg_match("/@gmail\.com$/","[email protected]"))?'true':'false';
1

これが高速かどうかはわかりませんが、1文字のテストの場合、これらも機能します。

(array_pop(str_split($string)) === $test) ? true : false;
($string[strlen($string)-1] === $test) ? true : false;
(strrev($string)[0] === $test) ? true : false;
1
wloske

Strrchr()のような逆関数は、文字列の末尾を最も早く一致させるのに役立つと考えています。

0
tkotitan