Какова самая эффективная проверка того, заканчивается ли строка PHP другой строкой?

Стандартный PHP-способ проверить, заканчивается ли строка $str с помощью подстроки $test :

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

Это самый быстрый способ?

То, что сказал Ассаф, верен. Для этого есть встроенная функция 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; } 

Этот метод немного дороже памяти, но он быстрее:

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

Это лучше всего, когда вы точно знаете, что такое игла, поэтому вы можете жестко изменить ее. Если вы программно переверните иглу, она станет медленнее, чем предыдущий метод.

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

Отрицательное смещение "начинает отсчет с конца строки".

Это зависит от того, какую эффективность вы заботитесь.

Ваша версия использует больше памяти из-за дополнительной копии с использованием substr.

Альтернативная версия может искать исходную строку для последнего вхождения подстроки без копирования, но, вероятно, будет медленнее из-за большего тестирования.

Вероятно, наиболее эффективным способом является выполнение char char-by-char с позиции -sterlen (test) до конца строки и сравнения. Это минимальное количество сравнений, которое вы можете надеяться сделать, и вряд ли какая-либо дополнительная память используется.

Вот простой способ проверить, заканчивается ли одна строка с другой, предоставляя strpos смещение прямо там, где должна быть найдена строка:

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

Не знаю, быстро ли это или нет, но для одного теста на символ, эти работы тоже:

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

Я думаю, что обратные функции, такие как strrchr (), помогут вам быстрее совместить конец строки.

Это чистый 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; }