Стандартный 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; }