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

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

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

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Прямо, и я думаю, что это работает на PHP 4.

Ответ 5

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

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

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

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

Ответ 6

Другой способ - использовать функцию strrpos:

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

Но это не быстрее.

Ответ 7

Я надеюсь, что приведенный ниже ответ может быть эффективным и простым:

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

Ответ 8

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

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

Ответ 9

Самый простой способ проверить это с помощью регулярного выражения

например, чтобы проверить, является ли данное письмо gmail:

echo (preg_match("/@gmail\.com$/","[email protected]"))?'true':'false';

Ответ 10

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

Ответ 11

для одноangularьной иглы:

if (@strrev($haystack)[0] == $needle) {
   // yes, it ends...
}

Ответ 12

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