このトピックでは、Discourseの監視ワード機能内で正規表現(regex)を効果的に使用する方法について説明します。
当社のホスティングを利用しているサイトでは、これらの設定は非表示になっています。有料ホスティングプランをご利用のお客様は、サポートチーム(
team@discourse.org)にご連絡いただければ、監視ワードでの正規表現をリクエストできます。
注: この機能は無料ホスティングプランでは利用できません。
正規表現(regex)は、検索パターンを定義するための強力なツールです。正規表現を監視ワード機能で使用することで、Discourseサイトでの単語フィルタリングの精度と柔軟性を高めることができます。
監視ワードで正規表現(regex)を使用するには、まずサイト設定の
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 には一致しません。
単語の境界
正規表現パターンは、意図せず単語の一部に一致してしまう可能性があります。部分一致を避けるために単語の境界を使用します。
\bthreads?\b
これは thread と threads に一致しますが、threadlike や unthreading のような一致は回避します。
Unicode文字の処理
標準の単語の境界は、Unicode文字では機能しない場合があります。JavaScriptの正規表現で適切に処理されない文字に対して境界を作成します。
gr(ü|ue)(ß|ss)e
これは、gruesse や GRÜSSE を含む、単語 grüße の一般的に綴られるすべての形式に一致します。
単語 Über はブロックしたいが、Übersicht はブロックしたくないとします。\b(ü|ue)ber\b のような単語の境界を使用しても、JavaScriptの正規表現の単語フラグの一部がUnicode文字を処理しないため機能しません。代わりに、独自の境界を作成する必要があります。
(?:^|\s)(ü|ue)ber\b
これにより、Übersicht や uebersicht には一致せず、Über と ueber に適切に一致するようになります。
意図的な文字の置換を検出する
ユーザーが文字の代わりとして数字や特殊文字を置換するケースを検出するには:
\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 に一致します。
Eメールパターンの検出
一般的なEメールアドレスのパターンを検出するには:
\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、d のいずれか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
これはトルコの文字 ö では正しく機能しない可能性があります。
追加情報
正規表現の式は https://regex101.com/ でテストできます。テストする際は、正規表現のフレーバーを ECMAScript に切り替えてください。
監視ワードの置換値では、正規表現のキャプチャグループの後方参照(例:置換文字列内の \1)はサポートされていません。置換アクションとリンクアクションではマッチングのために正規表現がサポートされていますが、置換は常にリテラル文字列になります。