說明:濫用過濾器使用指導/規則格式
過濾器規則格式類似 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( "你的字符串" )
來檢查哪些字符被轉換了。