Как наиболее эффективно проверить, заканчивается ли строка PHP другой строкой? - PullRequest
114 голосов
/ 06 марта 2009

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

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

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

Ответы [ 11 ]

141 голосов
/ 06 марта 2009

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

Этот метод немного дороже, но он быстрее:

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

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

50 голосов
/ 12 апреля 2016
$endsWith = substr_compare( $str, $test, -strlen( $test ) ) === 0

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

11 голосов
/ 10 марта 2011

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

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

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

8 голосов
/ 06 марта 2009

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

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

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

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

5 голосов
/ 06 марта 2009

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

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

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

3 голосов
/ 18 октября 2013

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

$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';
1 голос
/ 30 мая 2018

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

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

echo (preg_match("/@gmail\.com$/","example-email@gmail.com"))?'true':'false';
1 голос
/ 15 июля 2016

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

(array_pop(str_split($string)) === $test) ? true : false;
($string[strlen($string)-1] === $test) ? true : false;
(strrev($string)[0] === $test) ? true : false;
0 голосов
/ 30 декабря 2014

Это чистый 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...