什么是PHP字符串是否以另一个字符串结尾的最有效测试?

Jas*_*hen 119 php string performance

测试字符串是否$str以子字符串结尾的标准PHP方法$test是:

$endsWith = substr( $str, -strlen( $test ) ) == $test
Run Code Online (Sandbox Code Playgroud)

这是最快的方式吗?

mcr*_*ley 144

阿萨夫说的是正确的.PHP中有一个内置函数可以做到这一点.

substr_compare($str, $test, strlen($str)-strlen($test), strlen($test)) === 0;
Run Code Online (Sandbox Code Playgroud)

如果$test$strPHP 长,会发出警告,所以你需要先检查一下.

function endswith($string, $test) {
    $strlen = strlen($string);
    $testlen = strlen($test);
    if ($testlen > $strlen) return false;
    return substr_compare($string, $test, $strlen - $testlen, $testlen) === 0;
}
Run Code Online (Sandbox Code Playgroud)

  • mcrumley的答案很酷,但它应该使用'==='而不是'=='.'==='更严格,通常做你想要的,而'=='会导致令人讨厌的惊喜.mcrumley的第三个代码片段是正确的,但前两个不是.substr_compare()在某些错误情况下返回false.在PHP中,false == 0,因此代码片段将表示已找到该字符串.使用===,这不会发生. (2认同)

小智 66

这种方法的内存要贵得多,但速度更快:

stripos(strrev($haystack), $reversed_needle) === 0;
Run Code Online (Sandbox Code Playgroud)

当你确切地知道针是什么时,这是最好的,所以你可以反转硬编码.如果以编程方式反转针,它会比之前的方法慢.

  • -1我非常怀疑这是否更快,而且很棘手(很酷但通常没有帮助).如果干草堆*没有以针头结束,`stripos`将在最坏的情况下迭代整个字符串,而`substr_compare`将最多比较针的长度.是的,`substr_compare`需要计算干草堆的长度(以及更小的针),但是这种方法需要*和*完全复制它,并且可能将整个事物转换为小写以启动. (2认同)

Ale*_*ets 55

$endsWith = substr_compare( $str, $test, -strlen( $test ) ) === 0
Run Code Online (Sandbox Code Playgroud)

负偏移量"从字符串末尾开始计数".

  • IMO是所提供解决方案中最好的之一 (3认同)

Pat*_*ith 11

这是一种检查一个字符串是否以另一个字符串结尾的简单方法,通过strpos在应该找到字符串的位置给出一个偏移量:

function stringEndsWith($whole, $end)
{
    return (strpos($whole, $end, strlen($whole) - strlen($end)) !== false);
}
Run Code Online (Sandbox Code Playgroud)

直截了当,我认为这将在PHP 4中运行.


Ass*_*vie 9

这取决于你关心的效率.

由于使用substr的额外副本,您的版本使用更多内存.

替代版本可能会搜索原始字符串以查找子字符串的最后一次出现而不进行复制,但由于更多测试,可能会更慢.

可能最有效的方法是从-sterlen(测试)位置循环char-by-char直到字符串结束并进行比较.这是您希望做的最小比较量,并且几乎没有使用任何额外的内存.


Gum*_*mbo 5

另一种方法是使用该strrpos函数

strrpos($str, $test) == strlen($str) - strlen($test)
Run Code Online (Sandbox Code Playgroud)

但这并没有更快。


eri*_*111 5

在 PHP 8 中:

str_ends_with('haystack', 'stack'); // true
str_ends_with('haystack', 'K'); // false
Run Code Online (Sandbox Code Playgroud)

并且:

str_starts_with('haystack', 'hay'); // true
Run Code Online (Sandbox Code Playgroud)

PHP RFC:添加 str_starts_with()、str_ends_with() 及相关函数