Подсветка совпадений
Условие
highlight(text, query): вернуть массив кусков вида { text, match }. Совпадения без учёта регистра, все вхождения, регулярные символы в запросе экранируются. Пустой запрос даёт один кусок без подсветки.
Что проверяют тесты
одно совпадение
без учёта регистра, регистр сохраняется
несколько вхождений
пустой запрос
спецсимволы не ломают
нет совпадений
совпадение в начале
Как подойти
Два принципиальных решения. Первое: экранирование пользовательского ввода - без него запрос «(» обрушит регулярку, а «.*» подсветит всё. Второе: возвращать структуру, а не строку с тегами - склейка HTML в этом месте прямой путь к XSS, а куски данными безопасны в любом фреймворке. Совпадение нулевой длины зациклит exec, если не двигать lastIndex вручную.
Подсказки: 3
- Экранируй запрос: пользователь введёт скобку или звёздочку.
- Возвращай куски данными, а не готовую разметку - так вызывающий сам решит, чем обернуть.
- exec с глобальным флагом идёт по lastIndex - следи за совпадением нулевой длины.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.