str_ends_with
Выполняет проверку с учётом регистра, указывающую, заканчивается ли haystack подстрокой needle .
Список параметров
Подстрока для поиска в haystack .
Возвращаемые значения
Возвращает true , если haystack заканчивается подстрокой needle , false в противном случае.
Примеры
Пример #1 Использование пустой строки »
Результат выполнения данного примера:
Все строки заканчиваются пустой строкой
Пример #2 Демонстрация чувствительности к регистру
$string = ‘ленивая лиса перепрыгнула через забор’ ;
?php
if ( str_ends_with ( $string , ‘забор’ )) echo «Строка заканчивается на ‘забор’\n» ;
>
if ( str_ends_with ( $string , ‘Забор’ )) echo ‘Строка заканчивается на «Забор»‘ ;
> else echo ‘»Забор» не найден, потому что регистр не соответствует’ ;
>
Результат выполнения данного примера:
Строка заканчивается на 'забор' "Забор" не найден, потому что регистр не соответствует
Примечания
Замечание: Эта функция безопасна для обработки данных в двоичной форме.
Смотрите также
- str_contains() — Определяет, содержит ли строка заданную подстроку
- str_starts_with() — Проверяет, начинается ли строка с заданной подстроки
- stripos() — Возвращает позицию первого вхождения подстроки без учёта регистра
- strrpos() — Возвращает позицию последнего вхождения подстроки в строке
- strripos() — Возвращает позицию последнего вхождения подстроки без учёта регистра
- strstr() — Находит первое вхождение подстроки
- strpbrk() — Ищет в строке любой символ из заданного набора
- substr() — Возвращает подстроку
- preg_match() — Выполняет проверку на соответствие регулярному выражению
User Contributed Notes 3 notes
this is the fastest php7-implementation i can think of, it should be faster than javalc6 and Reinder’s implementations, as this one doesn’t create new strings (but theirs does)
if (! function_exists ( ‘str_ends_with’ )) function str_ends_with ( string $haystack , string $needle ): bool
$needle_len = strlen ( $needle );
return ( $needle_len === 0 || 0 === substr_compare ( $haystack , $needle , — $needle_len ));
>
>
?>
In PHP7 you may want to use:
if (!function_exists(‘str_ends_with’)) function str_ends_with($str, $end) return (@substr_compare($str, $end, -strlen($end))==0);
>
>
AFAIK that is binary safe and doesn’t need additional checks.
In case you are using an older version of PHP, you can define and use the following function:
function endsWith($haystack, $needle) $length = strlen($needle);
return $length > 0 ? substr($haystack, -$length) === $needle : true;
>
Как наиболее эффективно проверить, заканчивается ли строка PHP другой строкой?
То, что сказал Ассаф, верен. Для PHP существует встроенная функция 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; >
Ответ Макрумли клевый, но вместо ‘==’ следует использовать ‘===’. «===» более строг и обычно делает то, что вы хотите, в то время как «==» может привести к неприятным сюрпризам. Третий фрагмент кода mcrumley правильный, но первые два — нет. substr_compare () возвращает false в некоторых случаях ошибки. В PHP false == 0, поэтому фрагменты кода будут сигнализировать, что строка была найдена. С === этого не происходит.
Сегодня я столкнулся с ошибкой, которая сломает решение, которое вы дали из PHP 5.5.11 и далее. bugs.php.net/bug.php?id=67043
Этот метод немного дороже памяти, но быстрее:
stripos(strrev($haystack), $reversed_needle) === 0;
Это лучше всего, когда вы точно знаете, что такое игла, поэтому вы можете жестко изменить ее. Если вы программно переверните иглу, она станет медленнее, чем предыдущий метод.
-1 Я серьезно сомневаюсь, что это быстрее, и это сложно (круто, но обычно не полезно). Если стог сена не заканчивается иглой, в худшем случае stripos будут повторять всю строку, тогда как substr_compare будет сравнивать не более длины иглы. Да, substr_compare требует вычисления длины стога сена (и намного меньшей иглы), но этот метод требует этого и полностью копирует его, и, возможно, преобразует все это в нижний регистр для загрузки.
классный подход, но неэффективный (как уже упоминалось в самом ответе) во многих случаях! Тем не менее, это очень странно для творчества и демонстрации того, что всегда может быть больше способов сделать то же самое, что вы можете себе представить. Ура!
Я проверил и нашел этот метод быстрее, чем принятый ответ. Даже если стог сена и игла меняются местами на лету, это происходит быстрее.
$endsWith = substr_compare( $str, $test, -strlen( $test ) ) === 0
Отрицательное смещение начинается с конца строки.
+200, если бы мог. Ключевым моментом здесь является то, что использование отрицательной длины получает конечную часть строки. Вы также можете использовать substr с длиной -ve и выполнить == против $ test. Другие ответы плохие.
Вот простой способ проверить, заканчивается ли одна строка другим, предоставив strpos смещение вправо, где должна быть найдена строка:
function stringEndsWith($whole, $end)
Прямо, и я думаю, что это работает на PHP 4.
Это зависит от того, какую эффективность вы заботитесь.
Ваша версия использует больше памяти из-за дополнительной копии из использования substr.
Альтернативная версия может искать исходную строку для последнего вхождения подстроки без создания копии, но, вероятно, будет медленнее из-за большего количества тестов.
Вероятно, наиболее эффективным способом является выполнение цикла char -by- char из позиции -sterlen (test) до конца строки и сравнения. Это минимальное количество сравнений, которое вы можете надеяться сделать, и вряд ли какая-либо дополнительная память будет использоваться.
Какова самая эффективная проверка того, заканчивается ли строка 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)
Прямо, и я думаю, что это сработает на 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; >