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
, timestamp
和 user_*
可用。变量 article_*
也可用,但是前缀被分别代表原始页面名和目标页面名的 moved_from_
and moved_to_
所替换。举个例子,article_text
被替换成了 moved_from_text
和 moved_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'
,比如拒绝没有描述文本的文件。这将允许将上传文件和发布文件分开的工具(比如 UploadWizard 或 dialog)在用户花时间填写上传内容具体信息时通知用户上传失败的消息。
文章和页面命名空间
另请参阅 [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 中)); 对于irlike
,PCRE_CASELESS
和PCRE_UTF8
均启用了 (修饰符iu
)。contains
if ... then ... else ... end
... ? ... : ...
true
,false
和null
例子
代码 | 结果 | 注释 |
---|---|---|
"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)。执行顺序是:
- 任何被括号包围的内容(
(
和)
)被当作单个单元执行。 - 将变量/字面量转换为各自的数据。(例:设置
article_namespace
的值是0) - 函数(方法)调用 (
norm
,lcase
等) - 一元
+
和-
(定义正负值,比如-1234
和+1234
) - 关键字
- 布尔值翻转 (
!x
) - 指数运算 (
2**3 → 8
) - 乘法相关 (乘,除,取余)
- 加减法 (
3-2 → 1
) - 比较 (
<
,>
,==
) - 布尔运算 (
&
,|
,^
)
例子
A & B | C
和(A & B) | C
等同,但不和 not toA & (B | C)
等同。 具体地说,false & true | true
和false & false | true
都得到true
.A | B & C
和(A | B) & C
等同,但不和A | (B & C)
等同。 具体地说,true | true & false
和true | false & false
都得到false
.
条件判断计数
条件判断限制是一种比较运算数数量和函数(方法)调用数量的跟踪机制。
具体关于条件判断计数,以及如何减少条件判断计数的信息可在 Help:滥用过滤器使用指导/条件 找到。
有用的链接
|
备注
- ↑ 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 开始可用 gerrit:295254
- ↑ 3.0 3.1 注意 phab:T27619. 阁下可以使用 Special:AbuseFilter/tools 来评估代码
ccnorm( "你的字符串" )
来检查哪些字符被转换了。