При преобразовании большого списка отслеживаемых слов в регулярные выражения я обнаружил способы обхода фильтров. Они работают как для «обычных» отслеживаемых слов, так и для регулярных выражений.
Двойные пробелы: если ваше отслеживаемое слово — forbidden word, то его можно обойти, добавив несколько пробелов между двумя словами. Интересный факт: в опубликованном посте двойной пробел будет удалён, поэтому он совершенно невидим в итоговом тексте.
чтобы предотвратить это с помощью регулярных выражений: используйте forbidden\s*word
чтобы предотвратить это без регулярных выражений: я не нашёл решения.
Используйте символы подчёркивания, чтобы обойти границы слов:
без регулярных выражений: если вы окружите отслеживаемое слово символами подчёркивания, оно будет отображено курсивом и будет разрешено. Таким образом, _forbidden_ будет принято, если ваш фильтр — forbidden.
с регулярными выражениями: обычно границы слов проверяются только при использовании \b, и в этом случае символ подчёркивания их обойдёт. Таким образом, _forbidden_ будет принято, если ваш фильтр — \bforbidden\b.
чтобы предотвратить это с помощью регулярных выражений: используйте [\b\_] вместо \b. Редактирование: это, похоже, работает не очень хорошо.
Удаление границ слов тоже может сработать, но тогда вы рискуете случайно запретить такие слова, как cumulative и title
чтобы предотвратить это без регулярных выражений: я не нашёл решения.
Правильно, обычно мы не тратим время на борьбу с этим, потому что существует множество «хитрых» трюков для обхода любого списка запрещённых слов. Пространство Unicode очень велико.
Действительно, мы пытались реализовать это на ряде крупных образовательных проектов некоторое время назад.
Перед тем как проект был закрыт, они внедрили нечёткое сопоставление, что, как и следовало ожидать, вызвало всевозможные проблемы для легитимных случаев использования.
Слова в списке наблюдения служат в основном «первой линией обороны» от нежелательных слов. Тем не менее, вам всё ещё нужна помощь сообщества для выявления обходных путей и нарушений.
Ни одно регулярное выражение, которое вы когда-либо создадите, не сможет обнаружить .
Просто чтобы вы знали, [] обозначает «классы символов». В регулярных выражениях Perl и, возможно, Ruby, \b — это «граница слова» вне класса символов и «backspace» внутри класса символов. В C символ ‘\b’ всегда обозначает backspace (точнее, ). Backspace в большинстве случаев не является полезным символом, а границы слова полезны, поэтому и происходит переопределение.
Чтобы использовать регулярное выражение для поиска «forbidden» или «forbidden», я бы, вероятно, использовал:
\b_?forbidden_?\b
(Я также знаю, как закодировать все свои буквы с помощью XX (X), чтобы избежать Unicode-трюков или проблем с регулярными выражениями.)