Если честно, к сожалению, нет единого пути к решению.
Функция strip_tags хорошо работает с хорошо отформатированным HTML, и ваш пример недопустим.
Один из вариантов - написать собственный код, который «очищает» ввод в зависимости от его характера. Например, если на входе должен быть указан возраст кого-либо, удалите все, что не является цифрой. Вы можете сделать то же самое для имен, телефонов и т. Д. И т. Д.
Конечно, мы, как разработчики, не можем предвидеть все возможные бессмысленности, которые пользователь может ввести (намеренно или нет), и иногда мы получаем такие данные в БД. Вот почему всегда полезно избегать данных перед их печатью в HTML. Все фреймворки и шаблоны уже делают это для вас. Если вы не используете фреймворк, вы можете использовать функцию htmlentities - http://php.net/manual/en/function.htmlentities.php.
htmlentities сделает любые зарезервированные символы HTML сохраненными и не сломает вашу страницу. Например:
htmlentities("/> <img src=xxx onError=alert('test is here')");
приведет к:
/> <img src=xxx onError=alert('test is here')
И после рендеринга через браузер это будет выглядеть так:
