維基教科書:防濫用過濾器/操作指引
外觀
防濫用過濾器的語法格式與類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 |
||
編輯變更的Unified diff($1) | edit_diff |
||
編輯所做的Unified 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有關更改內容模型的資料 |
變量描述 | 變量名 | 資料型態 | 變量值 |
---|---|---|---|
使用者在$1的全域群組 | global_user_groups
|
變量描述 | 變量名 | 資料型態 | 變量值 |
---|---|---|---|
⧼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。
- 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