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

时间:2009-03-06 17:03:46

标签: php string performance

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

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

这是最快的方式吗?

13 个答案:

答案 0 :(得分:141)

Assaf所说的是对的。 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;
}

答案 1 :(得分:65)

这种方法的内存更加昂贵,但速度更快:

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

当您准确知道针的位置时,这是最好的,因此您可以对其进行硬编码。如果以编程方式反转针,它会比之前的方法慢。

答案 2 :(得分:48)

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

负偏移量“从字符串末尾开始计数”。

答案 3 :(得分:11)

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

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

直截了当,我认为这可以在PHP 4中运行。

答案 4 :(得分:8)

这取决于你关心的效率。

由于使用substr。

的额外副本,您的版本会占用更多内存

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

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

答案 5 :(得分:5)

另一种方法是使用strrpos function

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

但那并不快。

答案 6 :(得分:4)

在PHP 8中:

str_ends_with('haystack', 'stack'); // true
str_ends_with('haystack', 'K'); // false

还有:

str_starts_with('haystack', 'hay'); // true

PHP RFC: Add str_starts_with(), str_ends_with() and related functions

答案 7 :(得分:3)

我希望以下答案可能有效且简单:

$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';

答案 8 :(得分:1)

不知道这是否很快,但对于单一字符测试,这些工作也是如此:

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

答案 9 :(得分:0)

我认为像strrchr()这样的反向函数可以帮助你最快地匹配字符串的结尾。

答案 10 :(得分:0)

通过正则表达式检查它的最简单方法

例如检查所提供的邮件是否为gmail:

echo (preg_match("/@gmail\.com$/","example-email@gmail.com"))?'true':'false';

答案 11 :(得分:0)

对于单字符针:

if (@strrev($haystack)[0] == $needle) {
   // yes, it ends...
}

答案 12 :(得分:-1)

这是纯PHP,没有调用外部函数,除了 strlen

function endsWith ($ends, $string)
{
    $strLength = strlen ($string);
    $endsLength = strlen ($ends);
    for ($i = 0; $i < $endsLength; $i++)
    {
        if ($string [$strLength - $i - 1] !== $ends [$i])
            return false;
    }
    return true;
}