Есть функции, которые проверяют начинается или заканчивается ли строка другой подстрокой:
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 (можно буквально с конца к началу, а можно отступить от конца к началу на длину искомой строки и искать слева направо).
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Если выполнить на стороне js (при sumbit формы, например) $(this)serialize(), то в переменной получим данные формы в виде строки, которую можно спокойно...