Стандартный PHP-способ проверить, заканчивается ли строка $str
подстрокой $test
:
$endsWith = substr( $str, -strlen( $test ) ) == $test
Это самый быстрый способ?
Стандартный PHP-способ проверить, заканчивается ли строка $str
подстрокой $test
:
$endsWith = substr( $str, -strlen( $test ) ) == $test
Это самый быстрый способ?
То, что сказал Ассаф, верен. Для 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;
}
Этот метод немного дороже памяти, но быстрее:
stripos(strrev($haystack), $reversed_needle) === 0;
Это лучше всего, когда вы точно знаете, что такое игла, поэтому вы можете жестко изменить ее. Если вы программно переверните иглу, она станет медленнее, чем предыдущий метод.
$endsWith = substr_compare( $str, $test, -strlen( $test ) ) === 0
Отрицательное смещение начинается с конца строки.
Вот простой способ проверить, заканчивается ли одна строка другим, предоставив strpos
смещение вправо, где должна быть найдена строка:
function stringEndsWith($whole, $end)
{
return (strpos($whole, $end, strlen($whole) - strlen($end)) !== false);
}
Прямо, и я думаю, что это работает на PHP 4.
Это зависит от того, какую эффективность вы заботитесь.
Ваша версия использует больше памяти из-за дополнительной копии из использования substr.
Альтернативная версия может искать исходную строку для последнего вхождения подстроки без создания копии, но, вероятно, будет медленнее из-за большего количества тестов.
Вероятно, наиболее эффективным способом является выполнение цикла char -by- char из позиции -sterlen (test) до конца строки и сравнения. Это минимальное количество сравнений, которое вы можете надеяться сделать, и вряд ли какая-либо дополнительная память будет использоваться.
Другой способ - использовать функцию 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;
Самый простой способ проверить это с помощью регулярного выражения
например, чтобы проверить, является ли данное письмо gmail:
echo (preg_match("/@gmail\.com$/","[email protected]"))?'true':'false';
Я думаю, что обратные функции, такие как strrchr(), помогут вам быстрее совместить конец строки.
для одноangularьной иглы:
if (@strrev($haystack)[0] == $needle) {
// yes, it ends...
}
Это чистый 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;
}