Extension:AbuseFilter/Rules format/zh

規則格式与类C／JAVA／Perl语言的条件式十分相近.

字符串
宣告变量时，你可以将值填写在单引号或双引号中（字符串常量），亦可直接填写（数字变量，包括整型与浮点型浮點數）. 你可以使用 插入换行字元、 插入製表符（Tab），也可以使用半形反斜線来跳脫引號字元.

使用 （加號）來串接兩個字串常數或字串值的變數.


 * 範例:

用戶自訂變數
你可以定義自訂的變數，只要在一行中使用賦值符號 （以 結尾）並跟隨一個條件. 這些變數可以使用字母、底線和數字（除第一個字符外），並且不區分大小寫. 例如（來自w:Special:AbuseFilter/79）：

陣列
防濫用過濾器支援非關聯式陣列，如以下範例一樣使用.

註解文字
您可以使用以下語法來加入註解： /* 這是一條注釋 */

算术
你可以使用基本的算术符号对變數和常數进行算术运算，语法规则如下：


 * — 用左運算元减去右運算元.
 * — 将左、右-{zh-hans:操作数;zh-hant:運算元;}-相加.
 * — 将左、右-{zh-hans:操作数;zh-hant:運算元;}-相乘.
 * — 用右-{zh-hans:操作数;zh-hant:運算元;}-來除左-{zh-hans:操作数;zh-hant:運算元;}-.
 * — 对左-{zh-hans:操作数;zh-hant:運算元;}-求幂，幂次由右-{zh-hans:操作数;zh-hant:運算元;}-指定.
 * — -{zh-hans:返回;zh-hant:回傳;}-左-{zh-hans:操作数;zh-hant:運算元;}-除以右-{zh-hans:操作数;zh-hant:運算元;}-后的余数.

-{zh-hans:返回;zh-hant:回傳;}-結果的類型與PHP-{zh-hans:返回;zh-hant:回傳;}-的結果相同，可以在線上找到大量-{zh-hans:文檔;zh-hant:說明文件;}-. 更多詳盡的例子可以在此AF解析器測試中找到.

-{zh-hans:布尔;zh-hant:布林;}-运算
你可以要求满足所有条件为真，或满足任一条件为真，或只满足任一条件为真.


 * &mdash; OR – 如果两个条件中有一个或多个为真，则返回真值True.
 * &mdash; AND – 如果两个条件中所有条件都为真，则返回真值True.
 * &mdash; XOR – 如果两个条件中当且仅当一个条件为真，则返回真值True.
 * &mdash; NOT – 如果条件为假，则回傳True.

範例

简单的比较
你可以将-{zh-hans:变量;zh-hant:變數;}-与其他-{zh-hans:变量;zh-hant:變數;}-进行比较及運算，以下是语法规则：


 * &mdash; 如果左運算元分別小於／大於右運算元，則返回true. 注意：運算元會被轉換為-{zh-hant:字串;zh-hans:字符串;}-，就如同在PHP發生的一樣， 且.
 * &mdash; 如果左運算元分別小於或等於／大於或等於右運算元，則-{zh-hans:返回;zh-hant:回傳;}-true. 注意：運算元會被轉換為-{zh-hans:字符串;zh-hant:字串;}-，就如同在PHP發生的一樣， 且.
 * （或 ）、 &mdash;如果左運算元分別等於／不等於右運算元，則-{zh-hans:返回;zh-hant:回傳;}-true.
 * &mdash;如果左運算元等於右運算元且左運算元的資料類型等於右運算元的資料類型，則-{zh-hans:返回;zh-hant:回傳;}-true，只要有一個不符合，-{zh-hans:返回;zh-hant:回傳;}-false.

內建變數
防滥用过滤器可以根据-{zh-hans:变量;zh-hant:變數;}-的名称将各种-{zh-hans:变量;zh-hant:變數;}-传送给解析器. 你可以输入这些-{zh-hans:变量;zh-hant:變數;}-的名称来取用它们，就像取用-{zh-hans:常量;zh-hant:常數;}-一样. 在过滤日志中，你还可以看到各种请求的相关-{zh-hans:变量;zh-hant:變數;}-.

注意事項
當 ，只有 、 、 和 變數可用. 變數仍然可用，但其前綴已被取代為 和 ，以分別表示頁面的原本名稱和目標名稱的值. 例如 和 ，而不是.

自MediaWiki 1.28（https://gerrit.wikimedia.org/r/#/c/295254/）起， 僅用於發佈上傳檔案時，不再用於上傳至stash時. 新加入的 用於所有上傳行為，包括上傳至stash. This behaves like  used to, and only provides file metadata variables. Variables related to the page edit, including,   and several others, are now available for. For every file upload, filters may be called with  (for uploads to stash), and are always called with  ; they are not called with.

Filter authors should use  in filter code when a file can be checked based only on the file contents – for example, to reject low-resolution files – and   only when the wikitext parts of the edit need to be examined too – for example, to reject files with no description. This will allow tools that separate uploading the file and publishing the file (e.g. UploadWizard or upload dialog) to inform the user of the failure before they spend the time filling in the upload details.

效能
如同前面的記載，某些變數可能使速度變得非常慢. While writing filters, remember that the condition limit is not a good metric of how heavy filters are. For instance, variables like  or   always need a DB query to be computed, while   variables will have to perform parsing of the text, which again is a heavy operation; all these variables should be used very, very carefully. For instance, on Italian Wikipedia it's been observed that, with 135 active filters and an average of 450 used conditions, filters execution time was around 500ms, with peaks reaching 15 seconds. Removing the  variable from a single filter, and halving the cases when another filter would use   brought the average execution time to 50ms. 進一步來說：

Last but not least, note that whenever a variable is computed for a given filter, it'll be saved and any other filter will immediately retrieve it. This means that one single filter computing this variable counts more or less as dozens of filters using it.
 * Use  variables when you need high accuracy and checking for "http://..." in other variables (for instance,  ) could lead to heavy malfunctioning;
 * Use  variables when you're really sure that non-PST variables aren't enough. You may also conditionally decide which one to check: if, for instance, you want to examine a signature, check first if   contains  ;
 * In general, when dealing with these variables, it's always much better to consume further conditions but avoid computing heavy stuff. In order to achieve this, always put heavy variables as last conditions.

關鍵字
常用功能中通常會包含以下特殊關鍵字：


 * （或 ）— 如果左字符串能够匹配右字串指定的萬用字元，则傳回真值True.
 * — 如果左字串包含右字串，则傳回真值True. 注意： 空字串不被包含在任何其他字串，亦不包含任何其他字串（甚至不包含空字串本身）.
 * 類似 ，但左右運算子交換位置. 注意： 空字串不被包含在任何其他字串，亦不包含任何其他字串（甚至不包含空字串本身）.
 * （或 ）和 — 如果左字串能够匹配右字串指定的正規表示式，则傳回真值True（ 不區分大小寫）.

此系統使用PCRE. 只有 （PHP修飾字 ）選項被啟用. 有 和 選項被啟用（修飾字 ）.



範例

函式
为了简化一些常见的操作，防滥用过滤器提供了一系列内建的函式. 它们具有相同的格式 ，并且可以放置在常數或變數的位置使用. 它的参数可以是常數，可以是變數，亦可以是别的函式.

运算的顺序
运算通常是按由左至右的顺序進行的，但各运算的優先度并不相同. 當過濾器判斷某條件不符合時，會停止檢查之後的條件（由於短路求值）並移動至下一個過濾器. 運算顺序如下：


 * 1) 由半形小括號（ 与 ）括住的内容会被作为一个独立单元首先运算出.
 * 2) 将-{zh-hans:常量;zh-hant:常數 ;}-/常量转换为它们所代表的資料. （如 變成0）
 * 3) -{zh-hans:调用函数;zh-hant:呼叫函式;}- （ 、 等）
 * 4) 進行 和 的一元運算（定義正值或負值，例： ， ）
 * 5) 關鍵字 ( 、 等. )
 * 6) 布林反轉
 * 7) 求幂
 * 8) 乘法相关（乘、除、餘數）
 * 9) 加减法
 * 10) 比较.
 * 11) 布林运算

範例

 * 等同於 ，不同於 . 需特別留意， 和 的計算結果都是.
 * 等同於 ，不同於 . 需特別留意， 和 的計算結果都是.

條件計數
The condition limit is (more or less) tracking the number of comparison operators + number of function calls entered.

Further explanation on how to reduce conditions used can be found at.

排除
儘管防濫用過濾器的檢查功能會將「回退」操作標示為編輯，但防濫用過濾器不會檢查回退操作.

实用链接

 * PCRE模式語法
 * 編輯過濾器造福每個本地維基計畫