このトピックでは、Discourseの監視ワード機能内で正規表現(regex)を効果的に使用する方法について説明します。
当社のホスティングをご利用の場合、これらの設定は非表示になっています。有料ホスティングプランをご利用のお客様は、サポートチーム(
team@discourse.org)にご連絡いただければ、監視ワードでの正規表現をリクエストできます。
注: この機能は無料ホスティングプランでは利用できません。
正規表現(regex)は、検索パターンを定義するための強力なツールです。正規表現を監視ワード機能で使用することで、Discourseサイトでの単語フィルタリングの精度と柔軟性を高めることができます。
監視ワードで正規表現(regex)を使用するには、まずサイト設定の
watched words regular expressionsをオンにする必要があります。
Regexは非常に強力であるため危険です。誤って記述された正規表現ステートメントは、ユーザーに問題を引き起こす可能性があります。本番環境で公開する前に、非本番インスタンスで正規表現ステートメントをテストしてください。
正規表現パターンの例
ここでは、一般的な正規表現パターンとそれらの使用方法をいくつか紹介します。
大文字と小文字の区別をしない
デフォルトでは、Discourseは単語の大文字と小文字の両方に一致します。
thread
これは、thread、THREAD、thReAdに一致します。
文字の代替
文字の代替を使用して、一致する範囲を広げます。
(t|7)hr(3|e)(4|a)d
これは、上記のすべてのケースに加えて、thr3ad、7hread、thr34dに一致します。
threads?\\S+
これは、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
これにより、Ü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に一致します。
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]
これは、b、a、d、w、o、r、dのいずれか1文字に一致し、フレーズ “bad word” には一致しません。
量指定子の効果的な使用
\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/ でテストできます。テストする場合、正規表現のフレーバーをECMAScriptに切り替えるようにしてください。
監視ワードでは、Regexのキャプチャと置換はサポートされておらず、一致のみがサポートされているため、リンクアクションや置換アクションでは機能しません。