維基教科書:防濫用過濾器/操作指引
外觀
防濫用過濾器的語法格式與類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