Улучшить производительность php функций [startWith, endWIth]

313
19 августа 2017, 02:56

Есть функции, которые проверяют начинается или заканчивается ли строка другой подстрокой:

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));
    }
}

Но они слишком затратные, если ли варианты пооптимизированнее и чтобы поддерживало русский язык?

Спасибо.

Answer 1

Хорошо бы посмотреть на бенчмарк. Может выложите где-нить, чтоб можно было их погонять локально?

А пока такой совет. Если регистрозависимость не нужна, то и локаль вас не интересует, а посему можно сравнивать строки как 8-битные. Для startWith отрежьте от оригинальной строки столько байт, сколько имеет в длину искомая строка. И просто сравните строки друг с другом. Для endWith сделайте тоже самое, но обрежьте исходную строку с конца.

Можно пойти дальше и перебирать байты исходной строки и сравнивать каждый с байтом искомой по тому же индексу. Сначала для startWith и с конца для endWith (можно буквально с конца к началу, а можно отступить от конца к началу на длину искомой строки и искать слева направо).

READ ALSO
Ошибка в форме отправки

Ошибка в форме отправки

Есть сайт - ТЫК

293
Wordpress CMS изменение контента

Wordpress CMS изменение контента

Так есть изменить там надо кое чтоПароль и логин есть cpanel

236
Идентификатор формы при serialize()

Идентификатор формы при serialize()

Если выполнить на стороне js (при sumbit формы, например) $(this)serialize(), то в переменной получим данные формы в виде строки, которую можно спокойно...

254