Ao converter uma grande lista de palavras monitoradas para expressões regulares, descobri algumas formas de contornar os filtros. Essas táticas parecem funcionar tanto para palavras monitoradas “normais” quanto para expressões regulares.
Dois espaços: se sua palavra monitorada for palavra proibida, isso pode ser contornado ao inserir múltiplos espaços entre as duas palavras. Um fato interessante é que, na postagem final, o espaço duplo é removido, tornando-o totalmente invisível no texto final.
Para evitar isso usando expressões regulares: use palavra\s*proibida
Para evitar isso sem expressões regulares: não encontrei uma solução.
Use sublinhados para contornar os limites de palavras:
sem regex: se você envolver uma palavra monitorada por sublinhados, ela será exibida em itálico e será permitida. Assim, _proibido_ será aceito se seu filtro for proibido.
com regex: normalmente, os limites de palavras são verificados apenas se você usar \b, e nesse caso o sublinhado os supera. Assim, _proibido_ será aceito se seu filtro for \bproibido\b.
Para evitar isso usando expressões regulares: use [\b\_] em vez de \b EDIT: isso não parece funcionar bem.
Remover os limites de palavras também pode funcionar, mas você corre o risco de bloquear acidentalmente palavras como cumulativo e título
Para evitar isso sem expressões regulares: não encontrei uma solução.
Certo, geralmente esse não é o tipo de coisa em que gastamos tempo lutando, porque existem muitos truques “espertos” para contornar qualquer tipo de lista de bloqueio de palavras. O Unicode é um espaço muito, muito grande.
De fato, tentamos fazer isso em vários grandes projetos de educação, algum tempo atrás.
Antes de ser abandonado, eles lançaram com correspondência aproximada, o que, previsivelmente, causou todo tipo de problema para casos de uso legítimos.
Palavras monitoradas são principalmente uma “primeira linha de defesa” contra palavras ofensivas. Você ainda precisa da comunidade para sinalizar as tentativas de contorno e as violações.
Nenhuma expressão regular que você jamais crie será capaz de detectar uma .
Apenas para avisar, [] é para “classes de caracteres”. Em expressões regulares do Perl e possivelmente do Ruby, \b é uma “fronteira de palavra” fora de uma classe de caracteres e “retrocesso” dentro de uma classe de caracteres. Em C, ‘\b’ é sempre retrocesso (<control-H> para ser preciso). Retrocesso não é um caractere útil na maioria das vezes, enquanto fronteiras de palavra são, daí a redefinição.
Para usar uma ER para capturar “proibido” ou “proibido”, eu provavelmente usaria:
\b_?proibido_?\b
(Também sei como codificar todas as minhas letras em &#xXX; para evitar truques de Unicode ou a expressão regular.)