Для начала предлагаю уточнить значение слова фильтровать, выделив следующие варианты обработки пользовательских данных.
- Валидация, т.е. проверка соответствия введенных пользователем данных вашей бизнес-логики.
- Фильтрация, т.е. преобразование входных данных определенным образом. Например, вы можете обрезать начальные пробелы в строке или вырезать из неё html-тэги.
- Форматирование данных для корректной вставки в БД, вывода в HTML и т.д.
Для выполнения первых двух пунктов в php есть расширение
Filter, которое занимается проверкой и очисткой входных данных.
Третий пункт говорит, что если данные, полученные от пользователя, куда-либо подставляются, то они должны быть корректно отформатированы. Причем делать это нужно непосредственно в момент подстановки (записи в БД или вывода в html).
При выводе данных в html (если вы явно не допускаете вывод html-тегов) все специальные символы (кавычки, знаки больше и меньше, амперсанд) должны быть преобразованы в HTML-сущности. Этим как раз и занимается функция
htmlspecialchars.
Htmlentities преобразует не только эти символы, но и многие другие (точный список можно получить функцией
get_html_translation_table). Если вы используете на сайте utf-8, то она вам вообще не нужна.
Теперь о том, на что стоит обратить внимание при использовании
htmlspecialchars:
- В третьем параметре нужно указать кодировку, которую вы используете на сайте.
- Во втором параметре стоит указать флаг ENT_QUOTES, чтобы преобразовывались как двойные, так и одинарные кавычки. Потому как атрибуты могут быть записаны с использованием обеих (href="" и href=''). В html всегда стоит использовать кавычки при записи атрибутов (не пишите src=image1.jpg).
- Во втором параметре вы также можете указать флаг ENT_SUBSTITUTE (для php >= 5.4). В случае, если ваша строка будет содержать некорректно закодированные символы, они будут заменены на символ юникода. Без указанного флага вы получите пустую строку (подробности).
Итоговый вариант использования htmlspecialchars:
htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
Советую также посмотреть документацию к библиотеке
Zend\Escaper, которая содержит примеры корректного и некорректного форматирования данных при выводе в различные части html-документа.