Фильтр "Цензура" и криллица

Фильтр "Цензура" и криллица

от Sergey Titov -
Количество ответов: 0

Всем доброго дня!

Немного опыта использования фильтра, быть может кому-то пригодится информация. На сайте включил фильтр, чтобы сообщения учеников не шокировали родителей и столкнулся с проблемой работы фильтра на русском языке.

Если включить фильтр как есть, то появится множество ложных срабатываний, т.к. будут совпадения в нормальных словах. Например, слово "вебинар" стало на сайте (фильтр работает на всем сайте, не только в сообщениях) отображаться как в***нар. В самом фильтре нет никаких настроек, только вкл/выкл и список слов. Т.к. исключать слова себе дороже, было принято решение настроить фильтр на точное совпадение. Это можно сделать, заменив аргумент в функции filter (в файле /filter/censor/filter.php строки 75 и 78 (в версии 3.5.8)

Фильтр цензуры

Так же я сменил строку в title на свою строку, т.к. если оставить как было, то при наведении указателя мыши будет отображаться нецензурное слово.

После применения этих изменений, оказалось что не работает фильтр на русских словах, т.е. работает так же как и раньше по любому совпадению (при этом с английским начал работать только по точному совпадению).

Оказалось, что причина в регулярном выражении, по которому проверяется совпадение. Проверка ведется в файле /lib/filterlib.php в функции filter_prepare_phrases_for_filtering. Сравнения по регулярным выражениям '~^\w~' и '~\w$~' отрабатывает некорректно кириллицу. Из-за этого переменная workregexp создавалась некорректная.

В итоге заменил выражения на '~^[A-Za-z0-9_а-яА-ЯёЁ]~' и '/[A-Za-z0-9_а-яА-ЯёЁ]$/u' (строки 1424 и 1427)

Картинка_цензура2