维基教科书:防滥用过滤器/操作指引
外观
防滥用过滤器的语法格式与类C/JAVA/Perl语言的条件式十分相近。
常量
[编辑]你可以在单引号或双引号中填写字符串常量,亦可直接填写数字变量(包括整型与浮点型)。你可以使用\n来换行,而且你还可以使用半角反斜杠来转义引号字符。
- 例
"这是一条字符串" '这也是一条字符串' '虽然有单引号\',但这条字符串仍然有效' "这是一条带有\n换行符的字符串" 1234 1.234 -123
变量
[编辑]防滥用过滤器可以根据变量的名称将各种变量传送给解析器。你可以输入这些变量的名称来访问它们,就像访问常量一样。在过滤日志中,你还可以看到各请求的相关变量。
- 例
user_editcount article_recent_contributors
所有变量
[编辑]变量描述 | 变量名 | 数据类型; 型態=>zh-my:类型 | 变量值 |
---|---|---|---|
动作 | action |
string | edit(编辑)、move(移动)、createaccount(创建用户)、autocreateaccount(自动创建用户)、delete(删除)、upload[1]、stashupload[2] |
用户编辑次数($1) | user_editcount |
string | 匿名用户为空串 |
用户账号名称($1) | user_name |
string | |
确认电邮; 电子邮件=>zh-my:电邮地址的时间($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 |
若该页面仅由一位用户; 使用者=>zh-my:用户贡献则为空值(不确定),最多统计100个历史版本 | |
第一个为页面做出贡献的用户($1) | article_first_contributor |
变量描述 | 变量名 | 数据类型; 型態=>zh-my:类型 | 变量值 |
---|---|---|---|
编辑摘要/原因($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 |
||
移动目标页面的名字空间; 命名空间=>zh-my:名字空间($1) | moved_to_namespace |
||
移动源页面的名字空间; 命名空间=>zh-my:名字空间($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有关更改内容模型的数据 |
变量描述 | 变量名 | 数据类型; 型態=>zh-my:类型 | 变量值 |
---|---|---|---|
用户所属的全局用户组($1) | global_user_groups
|
变量描述 | 变量名 | 数据类型; 型態=>zh-my:类型 | 变量值 |
---|---|---|---|
⧼abusefilter-edit-builder-vars-board-articleid⧽ | board_articleid |
||
结构式讨论版块的名字空间; 命名空间=>zh-my:名字空间($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。
- rlike、irlike和regex如果左字符串能够匹配右字符串指定的正则表达式,则返回真值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” |
- 其他
- 例
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
运算符的顺序
[编辑]运算符通常是按从左向右的顺序运算的,但各运算符的优先级并不相同。顺序如下:
- 由半角圆括号(“(”与“)”)括住的内容会被作为一个独立单元首先运算出。
- 将变量/常量转换为它们所代表的数据。(如article_namespace to 0)
- 调用函数(norm、lcase等)
- 一元运算符+和-(例:-1234,+1234)
- 关键词
- 逻辑转换(!x)
- 求幂(2**3 → 8)
- 乘法相关(乘、除、模)
- 加减法(3-2 → 1)
- 比较(<,>,==)
- 逻辑运算(&,|,^,in)
注解
[编辑]- ↑ 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')。
- ↑ MediaWiki 1.28+ (https://gerrit.wikimedia.org/r/#/c/295254/)
- ↑ 自 https://gerrit.wikimedia.org/r/#/c/296268/ 起永远为false