Строка PHP хранит последовательность байтов
strlen измеряет байты, поэтому русское слово не обязано иметь ту же длину, что число видимых символов. Для пользовательского текста проект явно требует UTF-8 и расширение mbstring; для графем, эмодзи и сложных письменностей может понадобиться intl.
Не применяйте strtolower к любому языку и не ожидайте полноценного пользовательского поиска. Регистронезависимое сравнение, сортировка, slug и поиск — разные задачи с разными правилами локали и нормализации.
Четыре представления текста
Название не является URL
Пользователь может переименовать упражнение, использовать одинаковое название или добавить символ, который нельзя безопасно включить в адрес. Постоянный URL строится по неизменяемому id или отдельному уникальному slug, а display name остаётся свободным предметным текстом.
Если slug генерируется автоматически, определите политику транслитерации, пустого результата, коллизий и переименования. Не обещайте обратимость: slug — технический идентификатор для маршрута, а не резервная копия названия.
Экранирование в последней точке
<?php
declare(strict_types=1);
function htmlText(string $value): string
{
return htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
$name = '<Тяга & жим>';
echo htmlText($name);Нормализация не должна стирать данные
Удаление повторных пробелов полезно для поискового ключа, но способно повредить пароль, код, имя файла или художественное название. Сначала назовите цель преобразования, затем храните оригинал, если он нужен пользователю.
В PHP 8.5 появилась grapheme_levenshtein и встроенное URI API, но наличие удобной функции не определяет продуктовую политику. Решите, какие опечатки допустимы и когда два названия считаются одинаковыми, до выбора алгоритма.
Лабораторная работа
Спроектируйте ввод названия упражнения: сохраните исходный текст, создайте отдельный поисковый ключ и выведите название в HTML. Проверьте кириллицу, эмодзи, кавычки и визуально похожие строки.
Закрепите материал
Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- php.nethttps://www.php.net/releases/8.5/en.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- cheatsheetseries.owasp.orghttps://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.htmlПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .