次のことを行うルールを作成しようとしています。
Event:新しいコンテンツタイプフォーラムトピックを保存した後
条件:
アクション:
コンテンツの非公開
サイトにメッセージを表示:
「現在、ユーザー権限により、リンクを含むフォーラムトピックを投稿できません。投稿からすべてのリンクを削除し、次の編集リンクをクリックして再送信してください:[node:edit-url]
この予防措置により、フォーラムやコメントをスパムから守ることができます。リンクを投稿する機能が必要な場合は、サイト管理者に電子メールを送信してください:[site:mail] "
一般的な考え方は、ユーザーがフォーラムに登録して新しいフォーラムトピックを作成できるようにしたいが、これはスパムの背後にある目的全体であるため、リンクを投稿できないようにすることです。質の高い投稿をいくつか作成したら、このルールが適用されない信頼できるユーザーグループに移動し、リンクを投稿できるようにします。
テキスト形式を使用してタグを削除したくないのは、リンクを除いて、スパム投稿が引き続き公開されるためです。これにより、不快なスパム投稿がフォーラムインデックスに引き続き表示されます。
コアに含まれるモジュールPHPフィルターを有効にします。これにより、Execute custom PHP code
という名前の新しい条件が追加されます。この条件は、TRUEまたはFALSEを返す必要があります。
次に、PHPスニペットを$ node-> bodyフィールドにPHPのpreg_match
を使用する条件で記述します。多くの場所で有効なURLを確認するための正規表現パターンを見つけることができます- ここでは例 。
あまりにも多くのルールが関与する前に、ハニーポットと隠されたキャプチャを見てください。
私は argiepiano の答えがうまく機能するという解決策を信頼していますが、「 PHPを使用することの欠点は何ですか?ブロック、ノード、views-argsなどのコードをフィルターしますか? "可能な限りPHPフィルターを使用しないようにしてください。
Rules エクスポート形式のルールのプロトタイプを次に示します。これも質問の答えになるはずです。
_{ "rules_find_links_in_body" : {
"LABEL" : "Find links in body",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules" ],
"ON" : { "node_insert--article" : { "bundle" : "article" } },
"IF" : [
{ "user_has_role" : {
"account" : [ "site:current-user" ],
"roles" : { "value" : { "2" : "2" } }
}
},
{ "OR" : [
{ "text_matches" : {
"text" : [ "node:body:value" ],
"match" : "http(|s):\/\/+",
"operation" : "regex"
}
},
{ "text_matches" : {
"text" : [ "node:body:value" ],
"match" : "ANotAllowedTextStringInBody",
"operation" : "regex"
}
}
]
}
],
"DO" : [
{ "drupal_message" : { "message" : "Node body contains an URL ..." } }
]
}
}
_
上記のプロトタイプルールの詳細:
http(|s)://+
を使用します。これにより、 _http://
_または_https://
_で、質問のように「contains a link」にかなり近いはずです。これのバリエーションを発見します(たとえば、ANotAllowedTextStringInBody
のような他の文字列)。別のルール条件([〜#〜]または[〜#〜]を使用)は、それも気にします。Voilà、PHPフィルタは必要ありません。