什么是PHPstring是否以另一个string结尾的最有效的testing?

标准的PHP方法来testing一个string$str是否以子string$test结尾是:

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

这是最快的方法吗?

Assaf说的是正确的。 PHP中有一个内置函数来完成这个function。

 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; } 

这种方法只需要更多的内存,而且代价更高,

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

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

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

负偏移量“从string的末尾开始计数”。

这取决于你关心的是哪种效率。

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

一个替代版本可能会search原始string的最后一次出现的子string,而不会复制,但可能会由于更多的testing而变慢。

可能最有效的方法是从-sterlen(test)位置循环逐字符,直到string结束并进行比较。 这是你希望做的最less量的比较,而且几乎没有使用任何额外的内存。

这里有一个简单的方法来检查一个string是否以另一个string结束,通过给string赋予一个偏移量来findstring:

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

直截了当,我认为这将在PHP 4中工作。

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

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

但是,这不是更快。

我希望下面的答案可能有效,也很简单:

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

不知道这是否快速,但对于单个字符testing,这些工作也是:

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

我在想像strrchr()这样的反向函数会帮你匹配string的最后部分。

这是纯粹的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; }