維基教科書:防濫用過濾器/操作指引

防濫用過濾器的語法格式與類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有關更改內容模型的資料
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