Это не так просто, как вы могли бы подумать, потому что ни htmlspecialchars()
, ни htmlentities()
не предоставляют опций для игнорирования определенных тегов (обе функции даже не знают значение понятия теги ).
Вы можете использовать некоторые другие средства, чтобы позволить пользователям форматировать свои сообщения, например, BBCode , Текстиль или Уценка . Для всех них доступны парсеры PHP.
Если вам придется придерживаться html-тегов, вы можете прибегнуть к некоторой предварительной обработке, которая переформатирует разрешенные теги, чтобы на них не влиял htmlspecialchars()
. Затем вы можете постобработать результат, чтобы изменить формат обратно на обычные HTML-теги. Следующий пример визуализирует этот процесс для простого тега <a>
. Имейте в виду, что обработка HTML с помощью регулярных выражений подвержена ошибкам и не всегда является подходом. Я буду использовать его только для простоты в этом примере.
$input = preg_replace('~<(/?\w+([^>]*?))>~', '|#$1#|', $input);
$input = htmlspecialchars($input);
$inoput = preg_replace('~|#(/?\w+(.*?))#|~', '<$1>', $input);
Это не проверено и, безусловно, потребует гораздо больше работы.