维基教科书:防滥用过滤器/操作指引

防滥用过滤器的语法格式与类C/JAVA/Perl语言的条件式十分相近。

常量

编辑

你可以在单引号或双引号中填写字符串常量,亦可直接填写数字变量(包括整型与浮点型)。你可以使用\n来换行,而且你还可以使用半角反斜杠来转义引号字符。

"这是一条字符串"
'这也是一条字符串'
'虽然有单引号\',但这条字符串仍然有效'
"这是一条带有\n换行符的字符串"
1234
1.234
-123

变量

编辑

防滥用过滤器可以根据变量的名称将各种变量传送给解析器。你可以输入这些变量的名称来访问它们,就像访问常量一样。在过滤日志中,你还可以看到各请求的相关变量。

user_editcount
article_recent_contributors

所有变量

编辑
可用变量
变量描述 变量名 数据类型 变量值
动作 action string edit(编辑)、move(移动)、createaccount(创建用户)、autocreateaccount(自动创建用户)、delete(删除)、upload[1]、stashupload[2]
用户编辑次数($1) user_editcount string 匿名用户为空串
用户账号名称($1) user_name string
确认电子邮件地址的时间($1) user_emailconfirm string YYYYMMDDHHMMSS
用户账号年龄($1) user_age 单位为秒;IP为0
用户是否被封禁($1) user_blocked boolean 已封禁注册账户为1、匿名用户为null
用户是否通过移动版界面编辑($1) user_mobile boolean 是为1
用户所在的组(包括隐藏组)($1) user_groups
用户拥有的权限($1) user_rights
⧼abusefilter-edit-builder-vars-article-id⧽ (可在页面的HTML源代码搜索wgArticleId找到) article_articleid integer 理论上新建页面时为0,但这不一定可靠,请用old_size==0判断是否为新建页面
⧼abusefilter-edit-builder-vars-article-ns⧽ article_namespace integer 参见名字空间索引
⧼abusefilter-edit-builder-vars-article-text⧽ article_text string
⧼abusefilter-edit-builder-vars-article-prefixedtext⧽ article_prefixedtext string
页面的编辑保护等级($1) article_restrictions_edit
页面的移动保护等级($1) article_restrictions_move
文件的上传保护($1) article_restrictions_upload
页面的创建保护($1) article_restrictions_create
最后十位为该页面做出贡献的用户($1) article_recent_contributors 若该页面仅由一位用户贡献则为空值(不确定),最多统计100个历史版本
第一个为页面做出贡献的用户($1) article_first_contributor
对部分动作可用的变量
变量描述 变量名 数据类型 变量值
编辑摘要/原因($1) summary string
编辑是否被标记为小编辑(不再使用) minor_edit string [3]
编辑前的旧页面,去除所有标记(不再使用) old_wikitext
新页面文本(不含标记)($1) new_wikitext
编辑产生的差异($1) edit_diff
编辑的统一变更差异(已预保存转换)($1) edit_diff_pst
新页面大小($1) new_size integer
旧页面大小($1) old_size integer
编辑前后的大小变化($1) edit_delta
编辑中添加的行(已经过预保存转换)($1) added_lines_pst string
编辑中添加的行($1) added_lines string 最后差异中所有以+开头的行
编辑中删除的行($1) removed_lines
新文本中的所有外部链接($1) all_links
编辑之前页面中的链接($1) old_links
编辑中添加的所有外部链接($1) added_links
编辑中删除的所有外部链接($1) removed_links
新页面的wikitext(已预保存转换)($1) new_pst
新版本的HTML源代码 new_html
新页面的文字,去除所有标记 new_text
已停用 old_html
已停用 old_text
判读是否从一个tor出口所做出的编辑 tor_exit_node boolean 0, 1 (仅在TorBlock安装时有效)
更改的Unix时间戳 timestamp string 整数(timestamp),可用来计算日期;时间、星期
文件内容的SHA1哈希值($1) file_sha1 [1]
文件大小(以字节为单位)($1) file_size integer 文件大小,单位为字节[1]
移动目标页面的页面ID($1) moved_to_articleid
⧼Abusefilter-edit-builder-vars-movedto-prefixedtext⧽ moved_to_prefixedtext
移动目标页面的名字空间($1) moved_to_namespace
移动源页面的名字空间($1) moved_from_namespace
⧼abusefilter-edit-builder-vars-movedfrom-prefixedtext⧽ moved_from_prefixedtext
移动源页面的页面ID($1) moved_from_articleid
创建账号时的账号名称($1) accountname
旧版本的内容模型 old_content_model string 参见mw:Help:ChangeContentModel有关更改内容模型的数据
新版本的内容模型 new_content_model string See mw:Help:ChangeContentModel有关更改内容模型的数据
CentralAuth提供的变量
变量描述 变量名 数据类型 变量值
用户所属的全局用户组($1) global_user_groups
StructuredDiscussions的变量
变量描述 变量名 数据类型 变量值
⧼abusefilter-edit-builder-vars-board-articleid⧽ board_articleid
结构式讨论版块的名字空间($1) board_namespace 参见名字空间索引
⧼abusefilter-edit-builder-vars-board-text⧽ board_text
⧼abusefilter-edit-builder-vars-board-prefixedtext⧽ board_prefixedtext

简单的比较

编辑

你可以将变量与其他变量和常量进行比较,以下是语法规则:

  • <> — 如果左操作数分别小于/大于右操作数,则返回true。
  • <=>= — 如果左操作数分别小于或等于/大于或等于右操作数,则返回true。
  • ==!= — 如果左操作数分别等于/不等于右操作数,则返回true。
  • ===!== — 如果左操作数等于右操作数左操作数的数据类型等于右操作数的数据类型,则返回true,只要有一个不符合,返回false。
示例 结果
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

算术

编辑

你可以使用基本的算术符号对变量和常量进行算术运算,语法规则如下:

  • - — 用左操作数减去右操作数。
  • + — 将左、右操作数相加
  • * — 将左、右操作数相乘
  • / — 用右操作数去左操作数(右操作数不得为0)。
  • ** — 对左操作数求,幂次由右操作数指定。
  • % — 返回左操作数除以右操作数后的余数(右操作数不得为0)。
示例 结果
1 + 1 2
2 * 2 4
1 / 2 0.5
9 ** 2 81
6 % 5 1

字符串串联

编辑

你可以使用+(加号)来链接两个文本字符串或将两个变量值以字符串类型相连。

关键词

编辑

常见的功能实现中,往往会包括下列两种关键词:

  • like如果左字符串能够匹配右字符串指定的通配符,则返回真值True。
  • in如果左字符串包含右字符串,则返回真值True。
  • rlikeirlikeregex如果左字符串能够匹配右字符串指定的正则表达式,则返回真值True。
"1234" like "12?4"

结果:真 True

"1234" like "12*"

结果:真 True

"foo" in "foobar"

结果:真 True

"foo" regex "\w+"

结果:真 True

函数

编辑

为了简化一些常见的操作,防滥用过滤器提供了一系列内建的函数。它们具有相同的格式functionName(arg1,arg2,arg3),并可以放置在常量或变量的位置使用。它的参数可以是常量,可以是变量,亦可以是别的函数。

函数名 描述
lcase 将第一个参数转换为小写字母并返回之
length 返回第一个参数给出字符串的长度
string 转换为字符串数据类型
int 转换为整数数据类型
float 转换为浮点数据类型
bool 转换为布尔数据类型
norm 等价于rmwhitespace(rmspecials(rmdoubles(ccnorm(arg1))))
ccnorm 规范化参数中的易混淆/相近字符,并以标准形式返回之
specialratio 返回第一个参数中非字母字符除以所有字符的结果,亦即返回特殊字符比
rmspecials 移出第一个参数中特殊字符,并返回结果
rmdoubles 移出参数中重复的字符,并返回结果
rmwhitespace 移除空白(空格、制表符、换行符)
count 返回指针(第一个字符串)在栈(第二个字符串)中出现的次数。如果只给出一个参数,则默认使用半角逗号分割,并返回分割后片段的个数
rcount 与“count”类似,但指针使用正则表达式
ip_in_range 若用户IP(第一个字符串)与指定IP段(第二个字符串)匹配,则返回真值true
contains_any 若第一个字符串包含任何之后参数内的字符串(不限制参数数量),则返回真值true
substr returns the portion of the first string, by offset from the second argument (starts at 0) and maximum length from the third argument (optional)
strlen 等价于“length”
strpos 返回第一次匹配指针(第二个字符串)时,其位于栈(第一个字符串)的位置。当指针匹配栈的开头时,该函数会返回0,所以其可能被批判为false。更好的方法是使用===!==以检测是否发现
str_replace 用替换字符串替换所有匹配的搜索字符串。该函数有3个参数,其依次为:进行搜索的文本,搜索文本,替换文本
set 设定一个变量(第一个字符串)以给定值(第二个字符串),以备过滤器进一步使用。等价语法为:name := value.
set_var 等于“set”
其他
  • convert返回第二个参数转换为第一个参数指定的语言版本。使用于维基LanguageConverter。(该函数添加自rev:49399,需要rev:49397后Mediawiki版本支持)
length("Wikipedia")

结果:9

lcase("Wikipedia")

结果:wikipedia

ccnorm("ωɨƙɩᑭƐƉlα")

结果:W1K1PED1A

convert("zh-hant", "维基百科") 

结果:維基百科

rmdoubles( "foobybboo" )

结果:fobybo

specialratio("Wikipedia!")

结果:0.1

norm( "!!ω..ɨ..ƙ..ɩ..ᑭᑭ..Ɛ.Ɖ@@l%%α!!" )

结果:W1K1PED1A

count( "foo", "foofooboofoo" )

结果:3

count( "foo,bar,baz" )

结果:3

rmspecials( "FOOBAR!!1" )

结果:FOOBAR1

逻辑运算

编辑

逻辑方面,你可以要求满足所有条件为真,或满足任一条件为真,或只满足任一条件为真。

  • x | y - OR - 如果两个条件中有一个或多个为真,则返回真值True。
  • x & y - AND - 如果两个条件中所有条件都为真,则返回真值True。
  • x ^ y - XOR - 如果两个条件中当且仅当一个条件为真,则返回真值True。
  • !x - NOT - 如果条件为假,则返回真值True。
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

运算符的顺序

编辑

运算符通常是按从左向右的顺序运算的,但各运算符的优先级并不相同。顺序如下:

  1. 由半角圆括号(“(”与“)”)括住的内容会被作为一个独立单元首先运算出。
  2. 将变量/常量转换为它们所代表的数据。(如article_namespace to 0)
  3. 调用函数(normlcase等)
  4. 一元运算符+和-(例:-1234+1234
  5. 关键词
  6. 逻辑转换(!x
  7. 求幂(2**3 → 8
  8. 乘法相关(乘、除、模)
  9. 加减法(3-2 → 1
  10. 比较(<>==
  11. 逻辑运算(&|^in

注解

编辑
  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+ (https://gerrit.wikimedia.org/r/#/c/295254/)
  3. https://gerrit.wikimedia.org/r/#/c/296268/ 起永远为false