Есть функции, которые проверяют начинается или заканчивается ли строка другой подстрокой:
public static function startWith (string $string, string $needle, bool $caseSensitive = false) : bool
{
if($caseSensitive)
{
return mb_strpos($string, $needle) === 0;
}
else
{
return mb_stripos($string, $needle) === 0;
}
}
public static function endWith (string $string, string $needle, bool $caseSensitive = false) : bool
{
if($caseSensitive)
{
return mb_strrpos($string, $needle) === (mb_strlen($string) - mb_strlen($needle));
}
else
{
return mb_strripos($string, $needle) === (mb_strlen($string) - mb_strlen($needle));
}
}
Но они слишком затратные, если ли варианты пооптимизированнее и чтобы поддерживало русский язык?
Спасибо.
Хорошо бы посмотреть на бенчмарк. Может выложите где-нить, чтоб можно было их погонять локально?
А пока такой совет. Если регистрозависимость не нужна, то и локаль вас не интересует, а посему можно сравнивать строки как 8-битные. Для startWith отрежьте от оригинальной строки столько байт, сколько имеет в длину искомая строка. И просто сравните строки друг с другом. Для endWith сделайте тоже самое, но обрежьте исходную строку с конца.
Можно пойти дальше и перебирать байты исходной строки и сравнивать каждый с байтом искомой по тому же индексу. Сначала для startWith и с конца для endWith (можно буквально с конца к началу, а можно отступить от конца к началу на длину искомой строки и искать слева направо).
Сборка персонального компьютера от Artline: умный выбор для современных пользователей