このトピックでは、Discourse の Watched Words 機能内で正規表現 (regex) を効果的に使用する方法について説明します。
お客様のサイトが Discourse でホストされている場合は、この設定を有効にしたい場合は team@discourse.org までご連絡ください。
正規表現 (regex) は、検索パターンを定義するための強力なツールです。Watched Words 機能で regex を使用すると、Discourse サイトでの単語フィルタリングの精度と柔軟性を向上させることができます。
Watched Words で正規表現 (regex) を使用するには、まず
watched words regular expressionsサイト設定をオンにする必要があります。
Regex は非常に強力であり、したがって危険でもあります。不適切に記述された regex ステートメントは、ユーザーに問題を引き起こす可能性があります。本番環境以外のインスタンスで regex ステートメントをテストしてから、本番環境に適用してください。
Regex パターンの例
一般的な regex パターンと、それらをどのように使用できるかを以下に示します。
大文字・小文字の区別なし
デフォルトでは、Discourse は単語の大文字と小文字の両方の形式に一致します。
thread
これは thread、THREAD、thReAd に一致します。
文字の代替
文字の代替を使用して、一致する範囲を拡張します。
(t|7)hr(3|e)(4|a)d
これは上記のすべてのケースに加えて、thr3ad、7hread、thr34d に一致します。
threads?\S+
これは thread と threads に一致しますが、threaded や threading には一致しません。
単語の境界
Regex パターンは、意図せずに単語の一部に一致してしまうことがあります。単語の境界を使用して、部分一致を回避します。
\bthreads?\b
これは thread と threads に一致しますが、threadlike や unthreading のような一致は回避します。
Unicode 文字の処理
標準の単語境界は、Unicode 文字では機能しない場合があります。JavaScript の regex でうまく処理されない文字に対して、独自の境界を作成します。
gr(ü|ue)(ß|ss)e
これは、gruesse や GRÜSSE を含む、grüße という単語の一般的にスペルされたすべての形式に一致します。
「Über」という単語をブロックしたいが、「Übersicht」はブロックしたくないとします。単語の境界 \b(ü|ue)ber\b のようなものを使用しても、JavaScript の regex の単語フラグの一部は Unicode 文字を処理しないため、機能しません。代わりに、独自の境界を作成する必要があります。
(?:^|\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 に一致しますが、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 のいずれか 1 文字に一致するため、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 のいずれか 1 文字に一致します。
量指定子の効果的な使用
\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 には一致しません。
Unicode 文字の正しい処理
正しいアプローチ:
(?:^|\s)(ö|oe)zel\b
これは、Unicode 文字であっても、単語の境界で özel、oezel に一致します。
間違ったアプローチ:
\bözel\b
これは、トルコ語の文字 ö では正しく機能しない場合があります。
追加情報
Regex 式は https://regex101.com/ でテストできます。テストする場合は、regex のフレーバーを ECMAScript に切り替えてください。
Watched Words では、Regex のキャプチャと置換はサポートされておらず、一致のみがサポートされているため、リンクや置換アクションでは機能しません。