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

防濫用過濾器的語法格式與類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