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

What's the most efficient test of whether a PHP string ends with another string?

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

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

这是最快的路吗?


阿萨夫说的是对的。在PHP中有一个内置函数可以做到这一点。

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

如果$test$str长,php会给出警告,因此需要先检查一下。

1
2
3
4
5
6
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
stripos(strrev($haystack), $reversed_needle) === 0;

这是最好的当你确切知道什么是针,所以你可以硬编码它颠倒。如果按程序反转针,它会比以前的方法慢。


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

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


这里有一个简单的方法来检查一个字符串是否以另一个字符串结尾,方法是在应该找到该字符串的地方给strpos一个偏移量:

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

简单明了,我认为这在PHP4中是可行的。


这取决于你关心的效率。

由于使用了SUBSTR的额外副本,您的版本使用了更多的内存。

另一个版本可以在不复制的情况下搜索原始字符串中最后一次出现的子字符串,但可能会由于更多的测试而变慢。

最有效的方法可能是从-sterlen(test)位置到字符串末尾逐字符执行循环并进行比较。这是您希望进行的最小数量的比较,几乎没有使用任何额外的内存。


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

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

但这并不快。


我希望下面的答案既有效又简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$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';

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

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

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

例如,要检查给定的邮件是否为gmail:

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

我认为strrchr()这样的逆向函数可以帮助您最快地匹配字符串的末尾。


这是纯PHP,不调用外部函数,strlen除外。

1
2
3
4
5
6
7
8
9
10
11
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;
}