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
比$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;
}
Run Code Online (Sandbox Code Playgroud)
小智 66
这种方法的内存要贵得多,但速度更快:
stripos(strrev($haystack), $reversed_needle) === 0;
Run Code Online (Sandbox Code Playgroud)
当你确切地知道针是什么时,这是最好的,所以你可以反转硬编码.如果以编程方式反转针,它会比之前的方法慢.
Ale*_*ets 55
$endsWith = substr_compare( $str, $test, -strlen( $test ) ) === 0
Run Code Online (Sandbox Code Playgroud)
负偏移量"从字符串末尾开始计数".
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中运行.
这取决于你关心的效率.
由于使用substr的额外副本,您的版本使用更多内存.
替代版本可能会搜索原始字符串以查找子字符串的最后一次出现而不进行复制,但由于更多测试,可能会更慢.
可能最有效的方法是从-sterlen(测试)位置循环char-by-char直到字符串结束并进行比较.这是您希望做的最小比较量,并且几乎没有使用任何额外的内存.
另一种方法是使用该strrpos
函数:
strrpos($str, $test) == strlen($str) - strlen($test)
Run Code Online (Sandbox Code Playgroud)
但这并没有更快。
在 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() 及相关函数
归档时间: |
|
查看次数: |
87604 次 |
最近记录: |