Циклопедия:Синтаксис фильтров MediaWiki
Правила фильтров MediaWiki составляются на C/Java/Perl-подобном языке.
Литералы[править]
Литерал можно задать, поместив его в кавычки (для строк) или вводя напрямую (справедливо для целых и дробных чисел). Допускается использование разрывов строк с помощью \n, табуляций с указанием \t.
Примеры:
"Это строка"
'Это тоже строка'
'Это строка\t с табуляцией'
'Эта строка восхвал\'яет Зелева'
'А здесь присутствует\n перевод строки'
5678
5.678
-10
Комментарии[править]
Комментарии определяются следующим образом:
/* Комментарий */
Переменные[править]
Фильтр злоупотреблений передаёт парсеру различные переменные. Эти переменные можно получить, введя их имя в месте, где будут работать литералы. В журнале злоупотреблений можно просмотреть переменные, связанные с каждым запросом.
Примеры:
USER_EDITCOUNT
ARTICLE_RECENT_CONTRIBUTORS
Существует возможность определять пользовательские переменные. Для этого после названия переменной необходимо поставить знак :=, а в конце ;.
Пример:
line1:="(\{\{(r|R)eflist|\{\{(r|R)efs|<references\s?/>|</references\s?>)";
Списки задаются следующим образом:
a_list := [ 5, 6, 7];
Стандартные переменные[править]
| Название переменной | Описание | Тип данных | Значения |
|---|---|---|---|
timestamp |
Unix-время изменения | ||
accountname |
Имя учётной записи (при создании учётной записи) | string | |
action |
Действие | string | 'edit' 'move' 'createaccount' 'autocreateaccount' 'delete' 'upload'
|
added_lines |
Добавленные строки | string | |
edit_delta |
Изменение размера страницы при правке (в байтах) | integer | |
edit_diff |
Унифицированная разница изменений правки | ||
new_size |
Новый размер страницы (в байтах) | integer | |
old_size |
Старый размер страницы (в байтах) | integer | |
removed_lines |
Удалённые строки | string | |
summary |
Описание правки | string | |
article_articleid |
ID страницы (значение доступно при просмотре HTML-кода страницы, располагается в wgArticleId) |
integer | 0 для новых страниц |
article_namespace |
Пространство имён страницы | integer | Значение пространства имени в MediaWiki |
article_text |
Название страницы (без пространства имён) | string | |
article_prefixedtext |
Полное название страницы | string | |
moved_from_articleid |
ID переименовываемой страницы | integer | |
moved_from_namespace |
Пространство имён переименовываемой страницы | integer | Значение пространства имени в MediaWiki |
moved_from_text |
Название переименовываемой страницы (без пространства имён) | string | |
moved_from_prefixedtext |
Полное название переименовываемой страницы | string | |
moved_to_articleid |
ID целевой страницы переименования | integer | |
moved_to_namespace |
Пространство имён целевой страницы переименования | integer | Значение пространства имени в MediaWiki |
moved_to_text |
Название целевой страницы переименования (без пространства имён) | string | |
moved_to_prefixedtext |
Полное название целевой страницы переименования | string | |
user_editcount |
Число правок участника | integer | |
user_age |
Возраст учётной записи в секундах | integer | Для IP равен 0 |
user_name |
Имя учётной записи | string | |
user_groups |
Группы (включая неявные), в которых состоит участник | string | |
user_emailconfirm |
Время подтверждения адреса электронной почты | date | В формате YYYYMMDDHHMMSS |
old_wikitext |
Старый викитекст, до правки страницы | string | |
new_wikitext |
Новый викитекст, после правки страницы | string | |
added_links |
Все внешние ссылки, добавленные в правке | string | |
removed_links |
Все внешние ссылки, удалённые в правке | string | |
all_links |
Все внешние ссылки в новом тексте | string | |
new_text |
Новый текст страницы, очищенный от разметки | string | |
new_html |
Разобранный HTML-код новой версии | string | |
article_restrictions_edit |
Уровень защиты страницы от правок | string | |
article_restrictions_move |
Уровень защиты страницы от переименований | string | |
article_recent_contributors |
Последние десять редакторов страницы | string | |
old_links |
Ссылки на странице до правки | string | |
minor_edit |
Была ли правка отмечена как малое изменение | boolean | true; false; 0; 1 |
file_sha1 |
SHA1-хэш содержания файла |
Простые сравнения[править]
Переменные можно сравнивать с другими переменными или литералами с помощью следующего синтаксиса:
<и>возвращает значениеtrue, когда левый операнд меньше или больше правого соответственно.<=и>=возвращает значениеtrue, когда левый операнд не больше или не меньше правого соответственно.==(или=) и!=возвращает значениеtrue, если левый операнд равен или не равен правому соответственно.===и!==возвращает значениеtrue, если левый операнд равен или не равен правому соответственно, и имеет или не имеет такой же тип данных, что и правый операнд, соответственно.
| Пример | Результат |
|---|---|
3 == 4 |
false
|
5 != 9 |
true
|
10 > 11 |
false
|
10 < 11 |
true
|
0 == False |
true
|
0 === False |
false
|
Арифметические операции[править]
В фильтрах MediaWiki применяются следующие арифметические операции:
+складывает операнды.-вычитает правый операнд из левого.*умножает операнды./делит левый операнд на правый.**возводит левый операнд в степень, указанную в правом операнде.%возвращает остаток от деления левого операнда на правый.
| Пример | Результат |
|---|---|
2 ** 5 |
32
|
9 % 4 |
1
|
Слияние строк[править]
Объединение, или конкатенация строк осуществляется посредством применения знака + для двух символьных строк или переменных со значением string.
Ключевые слова[править]
like(илиmatches) возвращает значениеtrue, если левый операнд соответствует глобальному шаблону правого операнда.inвозвращает значениеtrue, если правый операнд содержит левый.rlike(илиregex) иirlikeвозвращает значениеtrue, если левый операнд содержит регулярное выражение правого операнда (irlikeне чувствителен к регистру). Система использует PCRE.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
|
Функции[править]
| Название | Описание |
|---|---|
length(string) |
Длина строки. |
lcase(string) |
Переводит все символы строки в нижний регистр. |
ccnorm(string) |
Производит нормализацию неоднозначных символов. |
rmdoubles(string) |
Удаляет повторяющиеся символы. |
specialratio(string) |
Возвращает результат деления количества специальных символов на общее число символов. |
norm(string) |
Осуществляет нормализацию. |
count(needle, haystack) |
Возвращает число вхождений первой строки во вторую. |
rcount(needle, haystack) |
Эквивалента предыдущей функции, однако манипулирует с регулярнгыми выражениями. |
rmwhitespace(text) |
Удаляет пробелы. |
rmspecials(text) |
Удаляет специальные символы. |
ip_in_range(ip, range) |
Проверяет, входит ли указанный IP-адрес в указанный диапазон. Если да, то возвращает значение true.
|
contains_any(haystack, needle1, needle2, ...) |
Возвращает true, если первая строка содержит любой из следующих аргументов. Число аргументов неограниченно.
|
substr(subject, offset, length) |
Возвращает часть строки путём смещения от второго аргумента на длину, указанную в третьем аргументе. Третий аргумент необязателен. |
strpos(haystack, needle) |
Возвращает позицию первого вхождения второй строки в первую. Функция может возвращать 0, если вторая строка находится в начале первой, поэтому предпочтительнее использование операторов === и !==.
|
str_replace(subject, search, replace) |
Заменяет все значения search в строке subject на replace.
|
set_var(var,value) |
Устанавливает переменную с заданным значением. |
Логические операции[править]
x & y— И. Возвращаетtrue, если верны все условия.x | y— ИЛИ. Возвращаетtrue, если верно хотя бы одно из условий.x ^ y— ИСКЛЮЧАЮЩЕЕ ИЛИ. Возвращаетtrue, если верно только одно из условий.!x— НЕ. Возвращаетtrue, если условие не верно.
| x | y | x & y | x | y | x ^ y | !x | !y |
|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 | 0 | 0 | 0 |
Приоритетность операций[править]
Операции, как правило, выполняются слева направо, но существует определённый порядок, по которому они будут выполняться. Как только расширение не может проверить одно из условий фильтра, оно останавливает проверку остальных и переходит к следующему фильтру.
Порядок выполнения операций:
- Всё, что заключено в круглые скобки
(и)воспринимается как единое целое. - Включение переменных/литералов в соответствующие данные.
- Вызовы функций.
- Унарный
+и унарный-(определяющий положительное или отрицательное значение, например,-5). - Ключевые слова.
- Логическая инверсия (
!x). - Возведение в степень.
- Умножение, деление и остаток от деления.
- Сложение и вычитание.
- Сравнения:
<,>,==. - Логические операции: (
&,|,^,in).
Ссылки[править]
- Extension:AbuseFilter/Rules format англ.
- Фильтр злоупотреблений в энциклопедии «Викиреальность»