이 주제는 Discourse의 Watched Words 기능 내에서 정규식(regex)을 효과적으로 사용하는 방법을 설명합니다.
우리 호스팅을 사용하는 사이트에서는 이 설정이 숨겨져 있습니다. 유료 호스팅 플랜 고객은
team@discourse.org로 문의하여 Watched Words에 대한 정규식 사용을 요청할 수 있습니다.
참고: 이 기능은 무료 호스팅 플랜에서는 사용할 수 없습니다.
정규식(regex)은 검색 패턴을 정의하는 강력한 도구입니다. Watched Words 기능에서 정규식을 사용하면 Discourse 사이트의 단어 필터링 정확도와 유연성을 높일 수 있습니다.
Watched Words에서 정규식을 사용하려면 먼저
watched_words_regular_expressions사이트 설정을 활성화해야 합니다.
정규식은 매우 강력하므로 위험할 수 있습니다. 잘못 작성된 정규식 문장은 사용자에게 문제를 일으킬 수 있습니다. 라이브 환경에 배포하기 전에 비생산(개발/테스트) 인스턴스에서 정규식 문장을 테스트하십시오.
정규식 패턴 예시
다음은 일반적인 정규식 패턴과 그 사용 방법입니다:
대소문자 무시
기본적으로 Discourse는 단어의 대문자와 소문자 형태를 모두 일치시킵니다.
thread
이것은 thread, THREAD, thReAd를 모두 일치시킵니다.
문자 대안
문자 대안을 사용하여 일치 범위를 확장할 수 있습니다.
(t|7)hr(3|e)(4|a)d
이것은 위의 모든 경우 외에도 thr3ad, 7hread, thr34d를 일치시킵니다.
threads?\b
이것은 thread와 threads는 일치시키지만 threaded나 threading은 일치시키지 않습니다.
단어 경계
정규식 패턴은 의도치 않게 단어의 일부와 일치할 수 있습니다. 부분 일치(partial match)를 방지하려면 단어 경계를 사용하십시오.
\bthreads?\b
이것은 thread와 threads를 일치시키지만 threadlike나 unthreading 같은 일치는 피합니다.
유니코드 문자 처리
표준 단어 경계는 유니코드 문자에서 실패할 수 있습니다. JavaScript 정규식으로 잘 처리되지 않는 문자를 위한 경계를 만들어야 합니다.
gr(ü|ue)(ß|ss)e
이것은 gruesse와 GRÜSSE를 포함하여 grüße 단어의 모든 일반적인 철자 형태를 일치시킵니다.
예를 들어 Über라는 단어는 차단하되 Übersicht는 차단하지 않으려 한다고 가정해 보겠습니다. \b(ü|ue)ber\b와 같은 단어 경계는 일부 JavaScript 정규식 단어 플래그가 유니코드 문자를 처리하지 않기 때문에 작동하지 않습니다. 대신 직접 경계를 만들어야 합니다.
(?:^|\s)(ü|ue)ber\b
이제 이 패턴은 Über와 ueber를 적절히 일치시키지만 Übersicht나 uebersicht는 일치시키지 않습니다.
의도적인 문자 치환 포착
사용자가 문자 대신 숫자나 특수 문자를 치환한 단어를 포착하려면:
\bp[a@]ssw[o0]rd\b
이것은 password, p@ssword, passw0rd, p@ssw0rd를 일치시키지만 mypassword나 password123는 일치시키지 않습니다.
구두점 사이 문자 처리
필터를 우회하기 위해 구두점을 삽입하는 시도를 포착하려면:
\bs\W*p\W*a\W*m\b
이것은 spam, s.p.a.m, s-p-a-m을 일치시키지만 s_p_a_m(밑줄은 문자(word character)입니다), spammy, myspam은 일치시키지 않습니다.
여러 단어 변형 일치
서로 다른 단어 형태로 나타날 수 있는 구문을 일치시키려면:
\b(contact|email|reach)( us| me)?\b
이것은 contact, contact us, contact me, email, email us, email me, reach, reach us, reach me를 일치시킵니다.
이메일 패턴 감지
일반적인 이메일 주소 패턴을 포착하려면:
\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}\b
이것은 user@example.com, my.name@sub.domain.co.uk, user+tag@domain.org를 일치시킵니다.
해시태그 변형 찾기
서로 다른 대소문자나 미세한 변형을 가진 해시태그를 일치시키려면:
\#(disc[o0]urse|f[o0]rum)\b
이것은 #discourse, #DISCOURSE, #disc0urse, #forum, #f0rum을 일치시키지만 #discourseengine이나 #forums는 일치시키지 않습니다.
반복 패턴 감지
스팸성 콘텐츠일 수 있는 반복 문자를 포착하려면:
([a-zA-Z])\1{3,}
이것은 aaaample, helllllo, yessssss를 일치시키며, 4회 이상 연속으로 반복되는 모든 문자를 감지합니다.
프로토콜 유무와 관계없이 URL 찾기
\b(?:https?:\/\/)?[\w-]+(\.[\w-]+)+\b
이것은 example.com, sub.domain.org, https://discourse.org, http://meta.discourse.org를 일치시킵니다.
중첩된 문자 클래스 피하기
올바른 예:
(hold)?
이것은 선택적 단어 "hold"를 올바르게 일치시킵니다.
또는 문자 대안을 원한다면:
[h][o0][l1][d]
이것은 hold, h0ld, ho1d, h01d를 일치시킵니다.
잘못된 예:
[h[o0][l1]d]?
이것은 문자 클래스를 잘못 중첩하려고 하며, h, o, 0, l, 1, d 중 어떤 단일 문자와도 일치하여 had, old 같은 단어와도 일치하게 됩니다.
선택적 단어를 위한 괄호 사용
올바른 예:
forum(s)?
이것은 forum, forums를 올바르게 일치시킵니다.
잘못된 예:
forum[s]?
이것은 “forum” 뒤에 선택적인 "s"가 오는 것을 일치시키지만, 불필요하게 문자 클래스를 사용합니다.
올바른 문자 클래스 사용
올바른 예:
bad word
“bad word” 구문을 일치시키기 위해
또는 문자 클래스 예시로:
[bB][aA][dD]
이것은 bad, Bad, bAd, BAD 등을 일치시킵니다.
잘못된 예:
[bad word]
이것은 “bad word” 구문이 아니라 b, a, d, w, o, r, d 중 어떤 단일 문자와도 일치합니다.
한정자(Quantifier) 효과적으로 사용하기
\b[0-9]{3,5}\b
이것은 3~5자리 숫자를 일치시킵니다: 123, 1234, 12345는 일치하지만 12나 123456은 일치하지 않습니다.
특정 반복 패턴의 경우:
(spam){2,3}
이것은 spamspam, spamspamspam을 일치시킵니다.
단어 경계 올바르게 적용하기
경계 없이:
free
이것은 free, freedom, carefree를 일치시킵니다.
경계 사용:
\bfree\b
이것은 free만 일치시키고, freedom이나 carefree는 일치시키지 않습니다.
유니코드 문자 올바르게 처리하기
올바른 접근법:
(?:^|\s)(ö|oe)zel\b
이것은 özel, oezel을 단어 경계에서 일치시키며, 유니코드 문자가 포함된 경우에도 작동합니다.
잘못된 접근법:
\bözel\b
이것은 터키어 문자 ö와 함께 올바르게 작동하지 않을 수 있습니다.
추가 정보
regex101: build, test, and debug regex 정규식 표현식을 테스트할 수 있습니다. 그렇게 할 경우, 정규식 맛(flavour)을 ECMAScript로 전환했는지 확인하십시오.
Watched Words 대체 값에서 정규식 캡처 그룹 백레퍼런스(예: 대체 문자열의 \1)는 지원되지 않습니다. replace 및 link 작업은 매칭을 위해 정규식을 지원하지만, 대체 값은 항상 리터럴 문자열입니다.