2023年政策修订增补工作正在进行中,欢迎参与!
  • Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

Help:滥用过滤器使用指导/规则格式

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索
Commons-emblem-notice.svg
这个页面“Help:滥用过滤器使用指导/规则格式”是萌娘百科的帮助文档
  • 本文用于介绍萌娘百科中一些特定功能的操作方法;
  • 本文仅是一篇论述,不属于方针或指引。如果本指南与相关方针或指引发生冲突或存在不一致的情况,请以方针或指引的条文为准。

过滤器规则格式类似 C/Java/Perl 的语言的条件语句。

字面量

阁下可以将内容放置于单引号或者双引号(用于字符串)来指定一个字面量,或者直接按其原样输入(对于数字,整数和浮点数皆可)。阁下可以用 \n 来表示换行,\t 来表示制表符,在引号字符前加反斜杠来转义引号字符。

例子

注释

阁下可以用下列语法输入注释:

/* 这是一条注释 */

变量

滥用过滤器按名字将不同变量传入解析器。这些变量可以通过在字面量可用的地方输入它们的名字来访问。阁下也可以在滥用日志里查看与每请求关联的变量定义。

阁下可以在理解了在一行(以;结尾算一行)里关联操作符号:=并带上一个条件的情况下定义更多的变量。例子(来自 enwp:Special:AbuseFilter/79

列表:

全部变量

所有情况下可用的变量
描述 名称 数据类型 可能的值
动作 action string edit, move, createaccount, autocreateaccount, delete, upload[1], stashupload[2]
用户的编辑次数 user_editcount string 对未注册用户来说是空值。
用户名 user_name string
用户电子邮件地址的确认时间 user_emailconfirm string YYYYMMDDHHMMSS
用户账号年龄 user_age 按秒计算。 IP 用户为 0。
用户是否被封禁 user_blocked boolean 被封禁用户的值是 1。
用户当前是否使用移动版界面编辑 user_mobile boolean 移动版编辑的值是 1。
用户组别 user_groups
用户所拥有的权限 user_rights
页面ID (可从 HTML 源代码找到 - 搜索 wgArticleId) article_articleid integer 理论上新页面的值应该是 0,但是这个判断不可靠。应当使用 "old_size==0" 来判断是否为新页面创建。
文章命名空间 article_namespace integer 请参考 命名空间索引
不包含命名空间的页面标题 article_text string
完整页面标题 article_prefixedtext string
页面编辑保护级别 article_restrictions_edit
页面移动保护级别 article_restrictions_move
页面上传保护级别 article_restrictions_upload
页面创建保护级别 article_restrictions_create
最后十个该页面的贡献者 article_recent_contributors 如果用户为唯一贡献者,则为空值。只检查最近 100 个历史版本。
页面的第一个贡献者 article_first_contributor
对于某些操作可用的变量
描述 名称 数据类型 可能的值
编辑摘要 summary string
编辑是否被标记为小编辑 minor_edit string
编辑前旧页面源代码 old_wikitext
编辑后新页面源代码 new_wikitext
因编辑造成的统一差异对比 edit_diff
因编辑造成的统一差异对比(保存前预处理后的版本) edit_diff_pst
新页面大小 new_size integer
新页面大小 old_size integer
页面大小差值 edit_delta
保存前预处理后的增加行数 added_lines_pst
增加行数 added_lines
减少行数 removed_lines
新文字里的所有外部链接 all_links
编辑前页面链接数量 old_links
编辑后增加的外部链接数量 added_links
编辑后减少的外部链接数量 removed_links
保存前预处理后的维基文本 new_pst
新版本解析后的HTML文本 new_html
去除了标签的新页面文字 new_text
已禁用 old_html
已禁用 old_text
编辑是否从 Tor 网络出口发送 tor_exit_node boolean 0, 1 (仅在 TorBlock 安装后可用)
编辑的 UNIX 时间戳 timestamp string int(timestamp) 将会给阁下呈现可用于年月日计算的数字。
文件内容的 SHA1 哈希值 file_sha1 [1]
文件大小 file_size integer 文件大小,按字节算[1]
移动目的地页面的页面ID moved_to_articleid
移动目的地页面的完整标题 moved_to_prefixedtext
移动目的地页面的命名空间 moved_to_namespace
移动原始页面的命名空间 moved_from_namespace
移动原始页面的完整标题 moved_from_prefixedtext
移动原始页面的页面ID moved_from_articleid
账号名(账号创建时) accountname
旧版本的内容模型 old_content_model string 关于内容模型变更的更多信息,详见 Help:ChangeContentModel
新版本的内容模型 new_content_model string 关于内容模型变更的更多信息,详见 Help:ChangeContentModel

CentralAuth 也提供一个类似 user_groups 的 global_user_groups 变量。

备注

action='move' 时,只有变量 summary, action, timestampuser_* 可用。变量 article_* 也可用,但是前缀被分别代表原始页面名和目标页面名的 moved_from_ and moved_to_ 所替换。举个例子,article_text 被替换成了 moved_from_textmoved_to_text

从 MediaWiki 1.28 开始(gerrit:295254),action='upload' 只在发布上传,而不是存放上传时使用。一个新 action='stashupload' 被引入,用于所有上传(包括存放上传)。它和过去的 action='upload' 行为类似,且只提供关于文件元数据的变量(file_*)。有关页面编辑的变量,包括 summary, new_wikitext 等等,现在对 action='upload' 可用。对于每一个文件上传操作,过滤器可能会以 action='stashupload' 被调用(对于上传到存放处),且过滤器一定会以 action='upload' 被调用。它们不再以 action='edit' 被调用。

过滤器作者应该在他(她)们的过滤器代码中使用 action='stashupload' | action='upload' 来检查文件内容,比如拒绝低分辨率文件;在需要检查文件上传的维基文本部分时只使用 action='upload',比如拒绝没有描述文本的文件。这将允许将上传文件和发布文件分开的工具(比如 UploadWizarddialog)在用户花时间填写上传内容具体信息时通知用户上传失败的消息。

文章和页面命名空间

另请参阅 [1]

英文维基百科命名空间
基本命名空间 讨论页命名空间
0 Main 主命名空间 Talk 讨论页 1
2 User 用户页 User talk 用户讨论页 3
4 Wikipedia 维基百科 Wikipedia talk 维基百科讨论页 5
6 File 文件 File talk 文件讨论页 7
8 MediaWiki MediaWiki talk MediaWiki 讨论页 9
10 Template 模板 Template talk 模板讨论页 11
12 Help 帮助 Help talk 帮助讨论页 13
14 Category 分类 Category talk 分类讨论页 15
100 Portal 门户 Portal talk 门户讨论页 101
108 Book 书籍 Book talk 书籍讨论页 109
虚拟命名空间
-1 Special 特殊页
-2 Media 媒体

简单比较

阁下可以使用 变量 和其他变量或字面符以如下语法进行比较:

  • <>—分别在左手运算数小于/大于右手运算数时返回真。
  • <=>=—分别在左手运算数小于或等于/大于或等于右手运算数时返回真。
  • == (or =) 和 !=—分别在左手运算数等于/不等于右手运算数时返回真。
  • ===!==—分别在左手运算数等于/不等于 右手运算数且左手运算数具有和右手运算数相同/不相同的数据类型时返回真。
例子 结果
1 == 2 false
1 <= 2 true
1 >= 2 false
1 != 2 true
1 < 2 true
1 > 2 false
2 = 2 true
'' == false true
'' === false false
1 = true true
1 === true false

算数符号

阁下可以使用按下列语法使用基本算术符号来进行变量和字面符的运算:

  • - — 从左手运算数里减去右手运算数。
  • + — 在左手运算数里加上右手运算数。
  • * — 将左手运算数和右手运算数相乘。
  • / — 将左手运算数除以右手运算数。
  • ** — 返回由右手运算数指定的左右运算数的指数幂。
  • % — 返回左手运算数除以右手运算数剩下的余数。
例子 结果
1 + 1 2
2 * 2 4
1 / 2 0.5
9 ** 2 81
6 % 5 1

字符串拼接

阁下可以使用 + 的加号符号来拼接两个字面量字符或者两个字符串类型的变量

关键字

下列特别关键字为常用功能所包含:

  • like (或 matches) 如果左右运算数匹配右手运算数的 Glob Pattern 则返回真。
  • in 如果右手运算数包含左手运算数则返回真。
  • rlike (或 regex) 和 irlike) 如果左手运算数包含右手运算数表述的 正则表达式 模型则返回真。 (irlike 大小写不敏感). 系统使用 PCRE 正则表达式。 仅有的启用的 PCRE 选项是 PCRE_UTF8 (修饰符 u (在 PHP 中)); 对于 irlikePCRE_CASELESSPCRE_UTF8 均启用了 (修饰符 iu)。
  • contains
  • if ... then ... else ... end
  • ... ? ... : ...
  • true, falsenull


例子

代码 结果 注释
"1234" like "12?4" True
"1234" like "12*" True
"foo" in "foobar" True
"foo" regex "\w+" True
"a\b" regex "a\\\\b" True 为了使用正则表达式查找转义反斜杠,阁下需要使用
四个反斜杠或者两个\x5C。 (两者皆可)
"a\b" regex "a\x5C\x5Cb" True

函数(方法)

一些简化常见问题解决的内建函数已经被包括。函数(方法)以 functionName( arg1, arg2, arg3 ) 这样的方法调用,并可以在任何用字面量和变量的地方使用。它们的参数可以是字面量,变量或是别的函数(方法)。

函数名称 描述
lcase 返回转换为小写的参数。
ucase 返回转换为大写的参数。
length 返回作为参数给出的字符串的长度。
string 转换到字符串数据类型。
int 转换到整数数据类型。
float 转换到浮点数数据类型。
bool 转换到布尔值数据类型。
norm 等同于 rmwhitespace(rmspecials(rmdoubles(ccnorm(arg1)))).
ccnorm 常规化参数中令人疑惑的或相近的字符,并返回一个候选形式。一个关于这些字符和替代的列表可以在这里找到。[3] 请注意为了让这个函数生效,扩展 AntiSpoof 需要被安装。如果没有安装,则字符串不会被变更。
specialratio 返回非字母数字字符的数量除以参数中的字符总数。
rmspecials 删除参数中的任何特殊字符,并返回结果。 (等同于 s/[^\p{L}\p{N}]//g)
rmdoubles 删除参数中的重复字符,并返回结果。
rmwhitespace 删除空格(空格,制表符,换行符)。
count 返回第一个字符串出现在第二个字符串中的次数。 如果只给出一个参数,则用逗号分隔它并返回段数。
rcount count 类似,但是第一个字符串使用正则表达式。可以在正则表达式开头加入 (?i) 来使得其大小写不敏感。
ip_in_range 如果用户的IP(第一个字符串)匹配指定的IP范围(第二个字符串),则返回真。 仅适用于匿名用户。 支持IPv4和IPv6地址。
contains_any 如果第一个字符串包含以下参数中的任何字符串(无限数量的参数),则返回真。
substr 返回第一个字符串的部分,从第二个参数(从0开始)和最大长度(可选的第三个参数)偏移。
strlen length 相同。
strpos 返回第一个字符串中第二个字符串第一次出现的数字位置。函数可能在没有找到时返回0,因此可能被其他比较运算符误解为 false 。最佳方案应该是使用 === 或者 !== 来判断是否找到字符串。
str_replace 用替换字符串替换所有出现的搜索字符串。该函数采用三个以下顺序的参数:要执行搜索的文本,要查找的文本,替换文本。
rescape 返回带有转义字符 "\" 的某些字符的参数,以便该字符串可以在正则表达式中使用,但不包含具有特殊含义的字符。
set 设置一个变量(第一个字符串)的值为第二个变量(第二个参数)以用于过滤器的后期使用。 另一种语法: name := value.
set_var set 相同。

其他

  • convert 按第一个参数指定的设置返回第二个参数的变种语言。 只对具有 LanguageConverter 类的 Wiki 站点有效。 (在 rev:49399加入,需要rev:49397后的MediaWiki)

例子

代码 结果 注释
length( "Wikipedia" ) 9
lcase( "WikiPedia" ) wikipedia
ccnorm( "w1k1p3d14" ) WIKIPEDIA ccnorm 返回的结果永远大写
ccnorm( "ωɨƙɩᑭƐƉ1α" ) WIKIPEDIA
ccnorm( "ìíîïĩї!ľį₤ĺľḷĿóòôöõǒōŏǫőọ$śŝşšṣ" ) ìíîïĩї!ľį₤ĺľḷĿóòôöõǒōŏǫőọ$śŝşšṣ 不是所有字符都被常规化了[3]
norm( "!!ω..ɨ..ƙ..ɩ..ᑭᑭ..Ɛ.Ɖ@@1%%α!!" ) WIKIPEDIA
norm( "F00 B@rr" ) FOBR norm 清除了空格、特殊字符和重复字符,然后使用ccnorm
rmdoubles( "foobybboo" ) fobybo
specialratio( "Wikipedia!" ) 0.1
count( "foo", "foofooboofoo" ) 3
count( "foo,bar,baz" ) 3
rmspecials( "FOOBAR!!1" ) FOOBAR1
rescape( "abc* (def)" ) abc\* \(def\)
str_replace( "foobarbaz", "bar", "-" ) foo-baz
ip_in_range( "127.0.10.0", "127.0.0.0/12" ) true
contains_any( "foobar", "x", "y", "f" ) true

布尔运算

阁下可以匹配诸多布尔值的情况,如有且只有所有条件为真,任意一个为真,或是仅有一个为真的情况。

  • x | y — 或 – 如果一个或多个条件为真,返回真。
  • x & y — 和 – 如果两个条件都为真,返回真。
  • x ^ y — 异或 – 如果有且仅有一个条件为真,返回真。
  • !x — 非 – 如果条件不为真,返回真。

Examples

代码 结果
1 | 1 true
1 | 0 true
0 | 0 false
1 & 1 true
1 & 0 false
0 & 0 false
1 ^ 1 false
1 ^ 0 true
0 ^ 0 false
!1 false

运算数顺序

操作通常是从左到右执行,但是执行有一个顺序。一旦过滤器不能满足其中的某个条件,它将会停止检查余下的(因为短路求值)并继续检查下一个过滤器(除了phab:T43693)。执行顺序是:

  1. 任何被括号包围的内容(())被当作单个单元执行。
  2. 将变量/字面量转换为各自的数据。(例:设置article_namespace的值是0)
  3. 函数(方法)调用 (norm, lcase等)
  4. 一元 +-(定义正负值,比如-1234+1234
  5. 关键字
  6. 布尔值翻转 (!x)
  7. 指数运算 (2**3 → 8)
  8. 乘法相关 (乘,除,取余)
  9. 加减法 (3-2 → 1)
  10. 比较 (<, >, ==)
  11. 布尔运算 (&, |, ^)

例子

  • A & B | C(A & B) | C 等同,但不和 not to A & (B | C) 等同。 具体地说,false & true | truefalse & false | true 都得到 true.
  • A | B & C(A | B) & C 等同,但不和 A | (B & C)等同。 具体地说,true | true & falsetrue | false & false 都得到 false.

条件判断计数

条件判断限制是一种比较运算数数量和函数(方法)调用数量的跟踪机制。

具体关于条件判断计数,以及如何减少条件判断计数的信息可在 Help:滥用过滤器使用指导/条件 找到。

有用的链接

备注

  1. 1.0 1.1 1.2 只对于对于文件上载可用的变量 (action='upload') 是 user_*, article_*, file_sha1, file_size, file_mime, file_mediatype, file_width, file_height, file_bits_per_channel (最后五个在 MediaWiki 1.27 发布时添加, gerrit:281503). 其他 file_* 变量对其他操作不可用 (包括 action='edit')。
  2. 从 MediaWiki 1.28 开始可用 gerrit:295254
  3. 3.0 3.1 注意 phab:T27619. 阁下可以使用 Special:AbuseFilter/tools 来评估代码 ccnorm( "你的字符串" )来检查哪些字符被转换了。