Regex를 사용하여 감시 단어 설정하기

:bookmark: 이 주제는 Discourse의 Watched Words 기능 내에서 정규식(regex)을 효과적으로 사용하는 방법을 설명합니다.

:discourse: 우리 호스팅을 사용하는 사이트에서는 이 설정이 숨겨져 있습니다. 유료 호스팅 플랜 고객은 team@discourse.org로 문의하여 Watched Words에 대한 정규식 사용을 요청할 수 있습니다.
참고: 이 기능은 무료 호스팅 플랜에서는 사용할 수 없습니다.

정규식(regex)은 검색 패턴을 정의하는 강력한 도구입니다. Watched Words 기능에서 정규식을 사용하면 Discourse 사이트의 단어 필터링 정확도와 유연성을 높일 수 있습니다.

:information_source: Watched Words에서 정규식을 사용하려면 먼저 watched_words_regular_expressions 사이트 설정을 활성화해야 합니다.

:warning: 정규식은 매우 강력하므로 위험할 수 있습니다. 잘못 작성된 정규식 문장은 사용자에게 문제를 일으킬 수 있습니다. 라이브 환경에 배포하기 전에 비생산(개발/테스트) 인스턴스에서 정규식 문장을 테스트하십시오.

정규식 패턴 예시

다음은 일반적인 정규식 패턴과 그 사용 방법입니다:

대소문자 무시

기본적으로 Discourse는 단어의 대문자와 소문자 형태를 모두 일치시킵니다.

thread

이것은 thread, THREAD, thReAd를 모두 일치시킵니다.

문자 대안

문자 대안을 사용하여 일치 범위를 확장할 수 있습니다.

(t|7)hr(3|e)(4|a)d

이것은 위의 모든 경우 외에도 thr3ad, 7hread, thr34d를 일치시킵니다.

threads?\b

이것은 threadthreads는 일치시키지만 threadedthreading은 일치시키지 않습니다.

단어 경계

정규식 패턴은 의도치 않게 단어의 일부와 일치할 수 있습니다. 부분 일치(partial match)를 방지하려면 단어 경계를 사용하십시오.

\bthreads?\b

이것은 threadthreads를 일치시키지만 threadlikeunthreading 같은 일치는 피합니다.

유니코드 문자 처리

표준 단어 경계는 유니코드 문자에서 실패할 수 있습니다. JavaScript 정규식으로 잘 처리되지 않는 문자를 위한 경계를 만들어야 합니다.

gr(ü|ue)(ß|ss)e

이것은 gruesseGRÜSSE를 포함하여 grüße 단어의 모든 일반적인 철자 형태를 일치시킵니다.

예를 들어 Über라는 단어는 차단하되 Übersicht는 차단하지 않으려 한다고 가정해 보겠습니다. \b(ü|ue)ber\b와 같은 단어 경계는 일부 JavaScript 정규식 단어 플래그가 유니코드 문자를 처리하지 않기 때문에 작동하지 않습니다. 대신 직접 경계를 만들어야 합니다.

(?:^|\s)(ü|ue)ber\b

이제 이 패턴은 Überueber를 적절히 일치시키지만 Übersichtuebersicht는 일치시키지 않습니다.

의도적인 문자 치환 포착

사용자가 문자 대신 숫자나 특수 문자를 치환한 단어를 포착하려면:

\bp[a@]ssw[o0]rd\b

이것은 password, p@ssword, passw0rd, p@ssw0rd를 일치시키지만 mypasswordpassword123는 일치시키지 않습니다.

구두점 사이 문자 처리

필터를 우회하기 위해 구두점을 삽입하는 시도를 포착하려면:

\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는 일치하지만 12123456은 일치하지 않습니다.

특정 반복 패턴의 경우:

(spam){2,3}

이것은 spamspam, spamspamspam을 일치시킵니다.

단어 경계 올바르게 적용하기

경계 없이:

free

이것은 free, freedom, carefree를 일치시킵니다.

경계 사용:

\bfree\b

이것은 free만 일치시키고, freedom이나 carefree는 일치시키지 않습니다.

유니코드 문자 올바르게 처리하기

올바른 접근법:

(?:^|\s)(ö|oe)zel\b

이것은 özel, oezel을 단어 경계에서 일치시키며, 유니코드 문자가 포함된 경우에도 작동합니다.

잘못된 접근법:

\bözel\b

이것은 터키어 문자 ö와 함께 올바르게 작동하지 않을 수 있습니다.

추가 정보

:information_source: regex101: build, test, and debug regex 정규식 표현식을 테스트할 수 있습니다. 그렇게 할 경우, 정규식 맛(flavour)을 ECMAScript로 전환했는지 확인하십시오.

Watched Words 대체 값에서 정규식 캡처 그룹 백레퍼런스(예: 대체 문자열의 \1)는 지원되지 않습니다. replace 및 link 작업은 매칭을 위해 정규식을 지원하지만, 대체 값은 항상 리터럴 문자열입니다.

13개의 좋아요

Forgive my noobness, but I was not able to find the site setting for watched words regular expressions anywhere. I also looked for regex, regular expression, and other variants, but didn’t find anything that looked like it would enable regex for watched words. Do you have the slug to the site settings where this could be enabled (cloud hosted instance)?

EDIT the answer was just above and found here

2개의 좋아요