대량의 감시 단어 목록을 정규식으로 변환하는 과정에서 필터를 우회하는 몇 가지 방법을 발견했습니다. 이러한 방법은 “일반” 감시 단어와 정규식 양쪽 모두에서 작동하는 것으로 보입니다.
더블 스페이스: 감시 단어가 forbidden word라면 두 단어 사이에 여러 개의 공백을 넣어서 우회할 수 있습니다. 재미있는 점은, 렌더링된 게시물에서는 이중 공백이 제거되어 최종 텍스트에서 완전히 보이지 않는다는 것입니다.
정규식을 사용하여 방지하는 방법: forbidden\s*word 사용
정규식 없이 방지하는 방법: 해결책을 찾지 못했습니다.
언더스코어 사용하여 단어 경계를 우회:
정규식 없이: 감시 단어를 언더스코어로 감싸면 이탤릭체로 표시되며 허용됩니다. 즉, 필터가 forbidden인 경우 _forbidden_가 허용됩니다.
정규식 사용: 일반적으로 단어 경계는 \b를 사용할 때만 검사되며, 이 경우 언더스코어가 이를 이깁니다. 즉, 필터가 \bforbidden\b인 경우 _forbidden_가 허용됩니다.
정규식을 사용하여 방지하는 방법: \b 대신 [\b\_] 사용 수정: 이 방법은 잘 작동하지 않는 것 같습니다.
단어 경계를 제거하는 것도 작동할 수 있지만, 그렇게 하면 cumulative나 title과 같은 단어를 실수로 차단할 위험이 있습니다
알려 드릴 것은, []는 "문자 클래스"를 나타냅니다. Perl 정규식, 그리고 아마도 Ruby 정규식에서도, \b는 문자 클래스 외부에서는 "단어 경계"를, 문자 클래스 내부에서는 "백스페이스"를 의미합니다. C 언어에서는 '\b’는 항상 백스페이스(정확히 말하면 )를 의미합니다. 백스페이스는 대부분의 경우 유용한 문자가 아니지만 단어 경계는 유용하므로, 이렇게 재정의된 것입니다.
정규식을 사용하여 “_forbidden_” 또는 "forbidden"을 포착하려면 다음을 사용할 것입니다:
\b_?forbidden_?\b
(유니코드 트릭이나 정규식을 피하기 위해 모든 문자를 &#xXX; 인코딩하는 방법도 알고 있습니다.)