Jump to content

Erweiterung:Missbrauchsfilter/Regelformat

From mediawiki.org
This page is a translated version of the page Extension:AbuseFilter/Rules format and the translation is 99% complete.

Die Regeln sind eine spezielle Sprache. Sie sind ähnlich formatiert wie Bedingungen in Sprachen wie C/Java/Perl.

Strings

Du kannst ein Literal angeben, indem du es in einfache oder doppelte Anführungszeichen setzt (für Zeichenketten) oder indem du es unverändert eingibst (für Zahlen, sowohl Gleitkomma- als auch Ganzzahlen). Zeilenumbrüche erhältst du mit \n, Tabulatorzeichen mit \t und du kannst das Anführungszeichen auch mit einem Backslash maskieren.

Verwende das Symbol + (Plus), um zwei Zeichenketten-Literale oder die Werte zweier Variablen mit einem Zeichenkettenwert zu verbinden.

Beispiele
"Dies ist eine Zeichenfolge"
'Dies ist auch eine Zeichenfolge'
'Diese Zeichenfolge sollte n\icht fehlschlagen'
"Diese Zeichenkette\nHat einen Zeilenumbruch"
1234
1.234
-123

Benutzerdefinierte Variablen

Du kannst benutzerdefinierte Variablen zum leichteren Verständnis mit dem Zuweisungssymbol := in einer Zeile (geschlossen durch ;) innerhalb einer Bedingung definieren. Solche Variablen können Buchstaben, Unterstriche und Zahlen (außer als erstes Zeichen) enthalten und unterscheiden nicht zwischen Groß- und Kleinschreibung. Beispiel (aus w:Special:AbuseFilter/79):

(
	line1:="(\{\{(r|R)eflist|\{\{(r|R)efs|<references\s?/>|</references\s?>)";
	rcount(line1, removed_lines)
) > (
	rcount(line1, added_lines)
)

Arrays

AbuseFilter unterstützt nicht-assoziative Arrays, die wie in den folgenden Beispielen verwendet werden können.

Achtung! Achtung: Ausdrücke wie page_namespace in [14, 15] funktionieren möglicherweise nicht wie erwartet. Hierbei wird auch dann als true ausgewertet, wenn page_namespace 1, 4 oder 5 ist. Für weitere Informationen und mögliche Umgehungen des Problems siehe bitte T181024.
my_array := [ 5, 6, 7, 10 ];
my_array[0] == 5
length(my_array) == 4
int( my_array ) === 4 // Identisch zu Länge
float( my_array ) === 4.0 // Zählt die Elemente
string(my_array) == "5\n6\n7\n10\n" // Hinweis: Der letzte Zeilenumbruch könnte in Zukunft entfernt werden
5 in my_array == true
'5' in my_array == true
'5\n6' in my_array == true // Hinweis: Dies liegt daran, wie Arrays in Zeichenketten umgewandelt werden, d. h. durch Implodieren mit Zeilenumbrüchen
1 in my_array == true // Hinweis: Dies passiert, weil „in“ Argumente in Zeichenketten umwandelt, sodass die 1 in „10“ gefunden wird und wahr zurückgegeben wird.
my_array[] := 57; // Dies hängt ein Element am Ende des Arrays an
my_array === [ 5, 6, 7, 10, 57 ]
my_array[2] := 42; // Und dies dient zum Ändern eines Elements im Array
my_array === [ 5, 6, 42, 10, 57 ]

Kommentare

Du kannst mit der folgenden Syntax Kommentare angeben:

/* Dies ist ein Kommentar */

Arithmetik

Du kannst grundlegende Rechensymbole verwenden, um mit Variablen und Literalen Rechenoperationen durchzuführen, indem du die folgende Syntax nutzt:

  • - – Subtrahiert den rechten Operanden vom linken Operanden.
  • + – Addiert den rechten Operanden zum linken Operanden.
  • * – Multipliziert den linken Operanden mit dem rechten Operanden.
  • / – Dividiert den linken Operanden durch den rechten Operanden.
  • ** – Erhöht den linken Operanden auf die durch den rechten Operanden angegebene Exponentialpotenz.
  • % – Gibt den Rest zurück, der entsteht, wenn der linke Operand durch den rechten Operanden geteilt wird.

Der Typ des zurückgegebenen Ergebnisses ist derselbe, der von PHP zurückgegeben werden würde, wofür online eine umfangreiche Dokumentation zu finden ist. Ausführlichere Beispiele finden sich in diesem AF-Parsertest.

Beispiel Ergebnis
1 + 1 2
2 * 2 4
1 / 2 0.5
9 ** 2 81
6 % 5 1

Boolesche Operationen

Du kannst eine Übereinstimmung erzielen, wenn alle Bedingungen wahr sind, wenn eine oder mehrere Bedingungen wahr sind oder wenn genau eine Bedingung wahr ist.

  • x | y — OR – gibt wahr zurück, wenn eine oder mehrere Bedingungen wahr sind.
  • x & y — AND – gibt wahr zurück, wenn beide Bedingungen wahr sind.
  • x ^ y — XOR – gibt wahr zurück, wenn nur eine der beiden Bedingungen wahr ist.
  • !x — NOT – gibt wahr zurück, wenn die Bedingung nicht wahr ist.

Beispiele

Code Ergebnis
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
!0 true

Einfache Vergleiche

Du kannst mit der folgenden Syntax Variablen mit anderen Variablen und Literalen vergleichen:

  • <, > – Gibt wahr zurück, wenn der linke Operand kleiner als/größer als der entsprechende rechte Operand ist. Beachte: Operanden werden in Zeichenketten umgewandelt und zwar, wie es in PHP der Fall ist, null < beliebige Zahl === true und null > beliebige Zahl === false.
  • <=, >= – Gibt wahr zurück, wenn der linke Operand kleiner oder gleich/größer oder gleich dem entsprechende rechten Operand ist. Beachte: Operanden werden in Zeichenketten umgewandelt und zwar, wie es in PHP der Fall ist, null <= beliebige Zahl === true und null >= beliebige Zahl === false.
  • == (oder =), != – Gibt wahr zurück, wenn der linke Operand gleich/ungleich dem entsprechenden rechten Operand ist.
  • ===, !== – Gibt wahr zurück, wenn der linke Operand gleich/ungleich dem entsprechenden rechten Operand ist UND der linke Operand jeweils den gleichen / einen anderen Datentyp wie der rechte Operand hat.
Beispiel Ergebnis
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','2','3'] == ['1','2','3'] true
[1,2,3] === [1,2,3] true
['1','2','3'] == [1,2,3] true
['1','2','3'] === [1,2,3] false
[1,1,''] == [true, true, false] true
[] == false & [] == null true
['1'] == '1' false[1]

Integrierte Variablen

Der Missbrauchsfilter übergibt verschiedene Variablen namentlich an den Parser. Auf diese Variablen kann zugegriffen werden, indem ihr Name an einer Stelle eingegeben wird, an der auch ein Literal funktionieren würde. Du kannst dir die mit jeder Anfrage verknüpften Variablen im Missbrauchsfilter-Logbuch ansehen.

Variablen von AbuseFilter

Immer verfügbare Variablen

Achtung! Achtung: Benutzerbezogene Variablen sind immer verfügbar, außer in einem Fall: Benutzerkontenerstellung, wenn der Ersteller nicht angemeldet ist. Alle Variablen, die mit user_ beginnen, sind betroffen, außer user_type.
Beschreibung Name Datentyp Anmerkungen
Aktion action Zeichenkette Eine der folgenden: edit, move, createaccount, autocreateaccount, delete, upload[2], stashupload[3]
Unix-Zeitstempel der Änderung timestamp Zeichenkette int(timestamp) gibt dir eine Zahl, mit der du das Datum, die Zeit, den Wochentag, etc. berechnen kannst.
Datenbankname des Wikis ($1) wiki_name Zeichenkette Dies ist beispielsweise "enwiki" in der englischsprachigen Wikipedia und "itwikiquote" im italienischen Wikiquote.
Sprachcode des Wikis ($1) wiki_language Zeichenkette Dies ist beispielsweise "en" in der englischsprachigen Wikipedia und "it" im italienischen Wikiquote. Mehrsprachige Wikis wie Commons, Meta und Wikidata werden ebenfalls als "en" angegeben.
Beitragszahl des Benutzers ($1) user_editcount Ganzzahl/null Null nur für nicht registrierte Benutzer.
Name des Benutzerkontos ($1) (IP in case the user is not registered) user_name Zeichenkette
Nutze für die Aktionen "createaccount" und "autocreateaccount" accountname, wenn du den Namen des erstellten Kontos erhalten möchtest.
Achtung! Achtung: On wikis where temporary accounts are enabled, IPs are not returned for unregistered users. Use user_unnamed_ip instead if the IP is needed. More context is available here .
Typ des Benutzerkontos ($1) user_type Zeichenkette Der Benutzertyp, einer von ip, temp (wenn der Benutzer ein temporäres Konto nutzt), named, external oder unknown.
Zeitpunkt, an dem die E-Mail-Adresse bestätigt wurde ($1) user_emailconfirm Zeichenkette/null Im Format: JJJJMMTTHHMMSS. Null, wenn die E-Mail nicht bestätigt wurde.
Alter des Benutzerkontos ($1) user_age Ganzzahl In Sekunden. 0 für unangemeldete Benutzer.
Ob der Benutzer gesperrt ist ($1) user_blocked Wahrheitswert True für gesperrte angemeldete Benutzer. Auch wahr für Bearbeitungen von gesperrten IP-Adressen, selbst wenn der Autor ein angemeldeter Benutzer ist, der nicht gesperrt ist. Ansonsten False.
Hierbei wird nicht zwischen partiellen und projektweiten Sperren unterschieden.
Gruppen (auch implizite), in denen der Benutzer Mitglied ist ($1) user_groups Array von Strings siehe Special:ListGroupRights
Rechte, die ein Benutzer hat ($1) user_rights Array von Zeichenketten siehe Special:ListGroupRights
Seitenkennnummer ($1) article_articleid Ganzzahl (veraltet) Verwende stattdessen page_id.
Seitenkennnummer ($1) (kann über den Link "Seiteninformation" in der Seitenleiste gesehen werden) page_id Ganzzahl Dies ist 0 für neue Seiten, ist bei der Betrachtung früherer Treffer jedoch nicht verlässlich. Wenn du beim Prüfen früherer Treffer ein genaues Ergebnis benötigst, nutze "page_age == 0", um die Erstellung neuer Seiten zu identifizieren. (Beachte, dass dies allerdings langsamer ist.) Dieses Problem wurde in 9369d08 behoben, implementiert am 11. September 2023.
Namensraum der Seite ($1) article_namespace Ganzzahl (veraltet) Verwende stattdessen page_namespace.
Namensraum der Seite ($1) page_namespace Ganzzahl bezieht sich auf den Namensraum-Index . Prüfe mit Ausdrücken wie "page_namespace == 2" oder "equals_to_any(page_namespace, 1, 3)" auf Namensräume
Seitenalter in Sekunden ($1) page_age Ganzzahl die Anzahl an Sekunden seit der ersten Bearbeitung (oder 0 für neue Seiten). Dies ist verlässlich, meist allerdings langsam; ziehe die Verwendung von page_id in Erwägung, wenn du keine hohe Genauigkeit benötigst.
Titel der Seite ohne Namensraum ($1) article_text Zeichenkette (veraltet) Verwende stattdessen page_title.
Titel der Seite ohne Namensraum ($1) page_title Zeichenkette
Vollständiger Seitentitel ($1) article_prefixedtext Zeichenkette (veraltet) Verwende stattdessen page_prefixedtitle.
Vollständiger Seitentitel ($1) page_prefixedtitle Zeichenkette
Bearbeiten-Schutzstufe der Seite ($1) article_restrictions_edit Zeichenkette (veraltet) Verwende stattdessen page_restrictions_edit.
Bearbeiten-Schutzstufe der Seite ($1) page_restrictions_edit Array von Strings
Verschieben-Schutzstufe der Seite ($1) article_restrictions_move Zeichenkette (veraltet) Verwende stattdessen page_restrictions_move.
Verschieben-Schutzstufe der Seite ($1) page_restrictions_move Array von Strings
Hochladeschutz der Datei ($1) article_restrictions_upload Zeichenkette (veraltet) Verwende stattdessen page_restrictions_upload.
Hochladeschutz der Datei ($1) page_restrictions_upload Array von Strings
Erstellschutz der Seite ($1) article_restrictions_create Zeichenkette (veraltet) Verwende stattdessen page_restrictions_create.
Erstellschutz der Seite ($1) page_restrictions_create Array von Strings
Die letzten zehn Bearbeiter der Seite ($1) article_recent_contributors array of strings (veraltet) Verwende stattdessen page_recent_contributors.
Die letzten zehn Bearbeiter der Seite ($1) page_recent_contributors Array von Zeichenketten Dies ist meist langsam (siehe #Leistung). Versuche, vor diese Bedingung andere Bedingungen zu setzen, die mit einer höheren Wahrscheinlichkeit als falsch ausgewertet werden, um die unnötige Ausführung der Abfrage zu vermeiden. Dieser Wert ist leer, wenn der Benutzer der einzige ist, der zu der Seite beigetragen hat (?) und prüft nur die letzten 100 Versionen
Erster Autor der Seite ($1) article_first_contributor Zeichenkette (veraltet) Verwende stattdessen page_first_contributor.
Erster Autor der Seite ($1) page_first_contributor Zeichenkette Dies ist meist langsam (siehe #Leistung).[4] Versuche, vor diese Bedingung andere Bedingungen zu setzen, die mit einer höheren Wahrscheinlichkeit als falsch ausgewertet werden, um die unnötige Ausführung der Abfrage zu vermeiden.

Für bestimmte Aktionen verfügbare Variablen

Achtung! Achtung: Überprüfe immer, ob die Variable, die du verwenden möchtest, für die Aktion, nach der aktuell gefiltert wird, verfügbar ist, z. B. durch die Verwendung der Variable action. Wenn du dies nicht tust (beispielsweise accountname für eine Bearbeitung oder edit_delta für eine Löschung nutzt), wird der gesamte Code, der die fragliche Variable verwendet, falsch zurückgeben.
Bearbeitungsvariablen sind für das Auswerten früherer Uploads nicht verfügbar. (T345896)
Beschreibung Name Datentyp Anmerkungen
Zusammenfassung/Grund ($1) summary Zeichenkette Von MediaWiki automatisch erstellte Zusammenfassungen ("Neuer Abschnitt", "Geleert", etc.) werden erstellt, nachdem der Filter die Bearbeitung geprüft hat, weshalb sie nie erfasst werden, auch wenn der Debugger anzeigt, dass sie erfasst werden sollten. The variable contains whatever the user sees in the edit summary window, which may include MediaWiki preloaded section titles.[5]
Ob die Bearbeitung als geringfügig markiert ist oder nicht (nicht mehr in Verwendung) minor_edit Zeichenkette Deaktiviert und für alle Einträge zwischen 2016 und 2018 auf falsch gesetzt.[6]
Alter Wikitext der Seite, vor der Bearbeitung ($1) old_wikitext Zeichenkette Diese Variable kann sehr groß sein. Ziehe zur Verbesserung der Leistung wenn möglich die Verwendung von removed_lines in Erwägung.
Neuer Wikitext der Seite, nach der Bearbeitung ($1) new_wikitext Zeichenkette Diese Variable kann sehr groß sein. Ziehe zur Verbesserung der Leistung wenn möglich die Verwendung von added_lines in Erwägung.
Vereinigter Versionsunterschied der Bearbeitung ($1) edit_diff Zeichenkette
Vereinigter Änderungsunterschied nach Bearbeitung, vor dem Speichern umgewandelt ($1) edit_diff_pst Zeichenkette Dies ist meist langsam (siehe #Leistung). Das Prüfen von sowohl added_lines als auch removed_lines ist wahrscheinlich effizienter.[7]
Neue Seitengröße ($1) new_size Ganzzahl
Alte Seitengröße ($1) old_size Ganzzahl
Größenänderung der Bearbeitung ($1) edit_delta Ganzzahl
Zeilen in der Bearbeitung hinzugefügt, vor dem Speichern umgewandelt ($1) added_lines_pst Array von Strings Nutze wenn möglich added_lines, was effizienter ist.
Durch die Bearbeitung hinzugefügte Zeilen ($1) added_lines Array von Strings enthält alle Zeilen im letzten Versionsunterschied, die mit + anfangen
Durch die Bearbeitung entfernte Zeilen ($1) removed_lines Array von Strings
Alle externen Links im neuen Text ($1) all_links Array von Zeichenketten Dies ist meist langsam (siehe #Leistung).
Links der Seite, vor der Bearbeitung ($1) old_links Array von Strings Dies ist meist langsam (siehe #Leistung).
Alle durch die Bearbeitung hinzugefügten externen Links ($1) added_links Array von Zeichenketten Dies ist meist langsam (siehe #Leistung). Ziehe in Erwägung, zunächst gegen added_lines zu prüfen und dann added_links, sodass weniger Bearbeitungen verlangsamt werden. Dies entspricht den MediaWiki-Regeln für externe Links . Nur einzigartige Links werden zum Array hinzugefügt. Das Ändern eines Links wird als ein hinzugefügter und ein entfernter Link gezählt.
Alle durch die Bearbeitung entfernten externen Links ($1) removed_links Array von Strings Dies ist meist langsam (siehe #Leistung). Ziehe in Erwägung, zunächst gegen removed_lines zu prüfen und dann removed_links, sodass weniger Bearbeitungen verlangsamt werden. Dies entspricht den MediaWiki-Regeln für externe Links . Nur einzigartige Links werden zum Array hinzugefügt. Das Ändern eines Links wird als ein hinzugefügter und ein entfernter Link gezählt.
Neuer Seitenwikitext, vor dem Speichern umgewandelt ($1) new_pst Zeichenkette Diese Variable kann sehr groß sein.
HTML-Quelltext der neuen Version ($1) new_html Zeichenkette Diese Variable kann sehr groß sein. Ziehe zur Verbesserung der Leistung wenn möglich die Verwendung von added_lines in Erwägung.
Neuer Seitentext, von jeglicher Textauszeichnung befreit ($1) new_text Zeichenkette Diese Variable kann sehr groß sein. Ziehe zur Verbesserung der Leistung wenn möglich die Verwendung von added_lines in Erwägung.
HTML-Quelltext der alten Version (nicht mehr in Verwendung) old_html Zeichenkette Aus Gründen der Leistung deaktiviert.
Alter Seitentext, von jeglicher Textauszeichnung befreit (nicht mehr in Verwendung) old_text Zeichenkette Aus Gründen der Leistung deaktiviert.
Zeit seit der letzten Seitenbearbeitung in Sekunden ($1) page_last_edit_age Ganzzahl oder null null wenn die Seite nicht existiert
SHA1-Hash von Dateiinhalt ($1) file_sha1 Zeichenkette [2]
Dateigröße in Bytes ($1) file_size Ganzzahl Die Dateigröße in Bytes[2]
Breite der Datei in Pixel ($1) file_width Ganzzahl Die Breite in Pixeln[2]
Höhe der Datei in Pixel ($1) file_height Ganzzahl Die Höhe in Pixeln[2]
Bits pro Farbkanal der Datei ($1) file_bits_per_channel Ganzzahl Die Anzahl von Bits je Farbkanal[2]
MIME-Typ der Datei ($1) file_mime Zeichenkette Der MIME-Typ der Datei.[2]
Medientyp der Datei ($1) file_mediatype Zeichenkette Der Medientyp der Datei.[8][2]
Seiten-ID der Zielseite ($1) moved_to_articleid Ganzzahl (veraltet) Verwende stattdessen moved_to_id.
Seiten-ID der Zielseite ($1) moved_to_id Ganzzahl
Titel der Zielseite ($1) moved_to_text Zeichenkette (veraltet) Verwende stattdessen moved_to_title.
Titel der Zielseite ($1) moved_to_title Zeichenkette
Vollständiger Titel der Zielseite ($1) moved_to_prefixedtext Zeichenkette (veraltet) Verwende stattdessen moved_to_prefixedtitle.
Vollständiger Titel der Zielseite ($1) moved_to_prefixedtitle Zeichenkette
Namensraum der Zielseite ($1) moved_to_namespace Ganzzahl
Verschiebe-Zielseiten-Alter in Sekunden ($1) moved_to_age Ganzzahl
Zeit seit der letzten Änderung der Zielseite in Sekunden ($1) moved_to_last_edit_age Ganzzahl oder null null wenn die Zielseite nicht existiert
Bearbeitungs-Schutzstatus der Verschiebe-Zielseite ($1) moved_to_restrictions_edit Array von Zeichenketten Selbes wie page_restrictions_edit, jedoch für das Ziel der Verschiebung.
Verschiebe-Schutzstatus der Verschiebe-Zielseite ($1) moved_to_restrictions_move Array von Zeichenketten Selbes wie page_restrictions_move, jedoch für das Ziel der Verschiebung.
Hochladeschutz der Verschiebe-Zieldatei ($1) moved_to_restrictions_upload Array von Zeichenketten Selbes wie page_restrictions_upload, jedoch für das Ziel der Verschiebung.
Erstellschutz der Verschiebe-Zielseite ($1) moved_to_restrictions_create Array von Zeichenketten Selbes wie page_restrictions_create, jedoch für das Ziel der Verschiebung.
Letzte zehn Benutzer, die zur Verschiebung der Zielseite beitragen ($1) moved_to_recent_contributors Array von Strings Selbes wie page_recent_contributors, jedoch für das Ziel der Verschiebung.
Erster Benutzer, der zur Verschiebung der Zielseite beiträgt ($1) moved_to_first_contributor Zeichenkette Selbes wie page_first_contributor, jedoch für das Ziel der Verschiebung.
Namensraum der Quellseite ($1) moved_from_namespace Ganzzahl
Titel der Quellseite ($1) moved_from_text Zeichenkette (veraltet) Verwende stattdessen moved_from_title.
Titel der Quellseite ($1) moved_from_title Zeichenkette
Vollständiger Titel der Quellseite ($1) moved_from_prefixedtext Zeichenkette (veraltet) Verwende stattdessen moved_from_prefixedtitle.
Vollständiger Titel der Quellseite ($1) moved_from_prefixedtitle Zeichenkette
Seiten-ID der Quellseite ($1) moved_from_articleid Ganzzahl (veraltet) Verwende stattdessen moved_from_id.
Seiten-ID der Quellseite ($1) moved_from_id Ganzzahl
Verschiebe-Quellseiten-Alter in Sekunden ($1) moved_from_age Ganzzahl
Zeit seit der letzten Änderung der Quellseite in Sekunden ($1) moved_from_last_edit_age Ganzzahl
Bearbeitungs-Schutzstatus der Verschiebe-Quellseite ($1) moved_from_restrictions_edit Array von Zeichenketten Selbes wie page_restrictions_edit, jedoch für die Seite, die verschoben wird.
Verschiebe-Schutzstatus der Verschiebe-Quellseite ($1) moved_from_restrictions_move Array von Zeichenketten Selbes wie page_restrictions_move, jedoch für die Seite, die verschoben wird.
Hochladeschutz der Verschiebe-Quelldatei ($1) moved_from_restrictions_upload Array von Zeichenketten Selbes wie page_restrictions_upload, jedoch für die Seite, die verschoben wird.
Erstellschutz der Verschiebe-Quellseite ($1) moved_from_restrictions_create Array von Zeichenketten Selbes wie page_restrictions_create, jedoch für die Seite, die verschoben wird.
Letzte zehn Benutzer, die zur Verschiebung der Quellseite beitragen ($1) moved_from_recent_contributors Array von Strings Selbes wie page_recent_contributors, jedoch für die Seite, die verschoben wird.
Erster Benutzer, der zur Verschiebung der Quellseite beiträgt ($1) moved_from_first_contributor Zeichenkette Selbes wie page_first_contributor, jedoch für die Seite, die verschoben wird.
Kontoname bei Kontoerstellung ($1) accountname Zeichenkette
Inhaltsmodell der alten Version old_content_model Zeichenkette Siehe Hilfe:ChangeContentModel für Informationen zur Änderung des Inhaltsmodells
Inhaltsmodell der neuen Version new_content_model Zeichenkette Siehe Hilfe:ChangeContentModel für Informationen zur Änderung des Inhaltsmodells

Geschützte Variablen

Eine Variable kann als geschützt betrachtet werden. Zum Beispiel gelten IP-Papiere in Wikis mit temporären Konten als PII und der Zugang zu ihnen muss eingeschränkt werden. Geschützte Variablen und Filter, die sie verwenden, sind nur für Betreuer mit dem Recht abusefilter-access-protected-vars zugänglich. Durch die Verwendung einer geschützten Variable wird auch der Filter als geschützt markiert. Der Schutz des Filters kann anschließend nicht entfernt werden, auch wenn er keine geschützte Variable mehr aktiv verwendet, da seine früheren Logbücher weiterhin verfügbar sind.

Logs generated by protected filters can only be viewed by users with the abusefilter-protected-vars-log right.

Die standardmäßig geschützten Variablen sind in AbuseFilterProtectedVariables in extension.json definiert.

user_unnamed_ip is null when examining past edits.
Beschreibung Name Datentyp Anmerkungen
IP-Adresse des Benutzerkontos (nur für abgemeldete Benutzer und temporäre Konten) ($1) user_unnamed_ip Zeichenkette Benutzer-IP für unangemeldete Benutzer / temporäre Konten
Dies gibt für angemeldete Benutzer null aus.


Variablen aus anderen Erweiterungen

Die meisten dieser Variablen werden bei der Untersuchung früherer Bearbeitungen immer auf falsch gesetzt und spiegeln möglicherweise ihren tatsächlichen Wert zum Zeitpunkt der Bearbeitung nicht wider. Siehe T102944.
Beschreibung Name Datentyp Werte Hinzugefügt von
Globale Gruppen, in denen der Benutzer ist ($1) global_user_groups Array CentralAuth
Globale Bearbeitungsanzahl des Benutzers ($1) global_user_editcount Ganzzahl CentralAuth
Globale Gruppen, in denen der Benutzer ist bei der Kontoerstellung ($1) global_account_groups Array Nur dann verfügbar, wenn action createaccount ist (dann ist es immer leer) oder autocreateaccount. CentralAuth
Globale Bearbeitungsanzahl des Benutzers bei der Kontoerstellung ($1) global_account_editcount Ganzzahl Nur dann verfügbar, wenn action createaccount ist (dann ist es immer null) oder autocreateaccount. CentralAuth
OAuth-Konsument, der zur Durchführung dieser Änderung verwendet wird ($1) oauth_consumer Ganzzahl OAuth
Seitenkennung des Strukturierte-Diskussionen-Boards ($1) board_articleid Ganzzahl (veraltet) Verwende stattdessen board_id. StructuredDiscussions
Seitenkennung des Strukturierte-Diskussionen-Boards ($1) board_id Ganzzahl StructuredDiscussions
Namensraum des Strukturierte-Diskussionen-Boards ($1) board_namespace Ganzzahl bezieht sich auf den Namensraum-Index StructuredDiscussions
Titel (ohne Namensraum) des Strukturierte-Diskussionen-Boards ($1) board_text Zeichenkette (veraltet) Verwende stattdessen board_title. StructuredDiscussions
Titel (ohne Namensraum) des Strukturierte-Diskussionen-Boards ($1) board_title Zeichenkette StructuredDiscussions
Vollständiger Titel des Strukturierte-Diskussionen-Boards ($1) board_prefixedtext Zeichenkette (veraltet) Verwende stattdessen board_prefixedtitle. StructuredDiscussions
Vollständiger Titel des Strukturierte-Diskussionen-Boards ($1) board_prefixedtitle Zeichenkette StructuredDiscussions
Quelltext der Übersetzungseinheit translate_source_text Zeichenkette Übersetzen
Zielsprache für die Übersetzung translate_target_language Zeichenkette Dies ist der Sprachcode, wie en für Englisch. Übersetzen
Änderung erfolgte durch einen Torausgangsknoten ($1) tor_exit_node Wahrheitswert wahr, wenn die Aktion von einem Tor-Ausgangsknoten kommt. TorBlock
Ob ein Benutzer über die mobile Oberfläche bearbeitet ($1) user_mobile Wahrheitswert wahr für mobile Nutzer, sonst falsch. MobileFrontend
Ob der Benutzer von der mobilen App bearbeitet ($1) user_app Wahrheitswert wahr, wenn der Benutzer von der mobilen App aus editiert, sonst falsch. MobileApp
Seitenaufrufe[1] article_views Ganzzahl (veraltet) Verwende stattdessen page_views. HitCounters
Seitenaufrufe[2] page_views Ganzzahl Die Anzahl der Seitenaufrufe HitCounters
Aufrufe der Quellseite[3] moved_from_views Ganzzahl Die Anzahl der Aufrufe der Quellseite HitCounters
Aufrufe der Zielseite[4] moved_to_views Ganzzahl Die Anzahl der Aufrufe der Zielseite HitCounters
Ob die IP-Adresse mittels der Liste stopforumspam.com gesperrt ist[5] sfs_blocked Wahrheitswert Ob die IP-Adresse mittels der Liste stopforumspam.com gesperrt ist StopForumSpam

Hinweise

Wenn action='move' ist, sind nur die Variablen summary, action, timestamp und user_* verfügbar. Die page_*-Variablen sind ebenfalls verfügbar, aber das Präfix wird durch moved_from_ und moved_to_ ersetzt, die die Werte des ursprünglichen Artikelnamens und des Zielnamens repräsentieren. Zum Beispiel moved_from_title und moved_to_title anstelle von page_title.

Seit MediaWiki 1.28 (gerrit:295254), wird action='upload' nur bei der Veröffentlichung eines Uploads verwendet und nicht für Stash-Uploads. Es wurde eine neue action='stashupload' eingeführt, die für alle Uploads verwendet wird, einschließlich Stash-Uploads. Dies verhält sich wie früher action='upload' und liefert nur Variablen für Datei-Metadaten (file_*). Variablen, die mit der Seitebearbeitung zusammenhängen, darunter summary, new_wikitext und einige andere, sind jetzt für action='upload' verfügbar. Für jeden Datei-Upload können Filter mit action='stashupload' (für Stash-Uploads) aufgerufen werden und sie werden immer mit action='upload' aufgerufen; sie werden nicht mit action='edit' aufgerufen.

Autoren von Filtern sollten action='stashupload' | action='upload' im Filtercode verwenden, wenn eine Datei nur auf Basis des Dateinhalts geprüft werden kann – beispielsweise um Dateien mit niedriger Auflösung abzulehnen – und action='upload' nur, wenn auch die Wikitext-Teile der Bearbeitung untersucht werden müssen – beispielsweise um Dateien ohne Beschreibung abzulehnen. Auf diese Weise können Werkzeuge, die das Hochladen und Veröffentlichen der Datei trennen (z. B. UploadWizard oder Hochladedialog ), den Benutzer über den Fehler informieren, bevor er Zeit mit dem Ausfüllen der Hochlade-Details verbringt.

Leistung

Wie in der obigen Tabelle vermerkt, können einige dieser Variablen sehr langsam sein. Bedenke beim Schreiben von Filtern, dass die Bedingungsgrenze kein gutes Maß für die Belastung durch Filter ist. Beispielsweise ist für die Berechnung von Variablen wie *_recent_contributors oder *_links immer eine DB-Abfrage erforderlich, während für Variablen wie *_pst eine Textanalyse erforderlich ist, was wiederum eine aufwändige Operation ist. Alle diese Variablen sollten mit äußerster Vorsicht verwendet werden. Beispielsweise wurde in der italienischen Wikipedia beobachtet, dass bei 135 aktiven Filtern und durchschnittlich 450 verbrauchten Bedingungen die Ausführungszeit der Filter bei etwa 500 ms lag, mit Spitzenwerten von bis zu 15 Sekunden. Durch das Entfernen der Variable added_links aus einem einzelnen Filter und die Halbierung der Fälle, in denen ein anderer Filter added_lines_pst verwenden würde, verringerte sich die durchschnittliche Ausführungszeit auf 50 ms. Genauer:

  • Verwende _links-Variablen, wenn eine hohe Genauigkeit erforderlich ist und die Prüfung von "http://..." in anderen Variablen (beispielsweise added_lines) ​​zu schweren Fehlfunktionen führen könnte;
  • Verwende _pst-Variablen, wenn du dir wirklich sicher bist, dass Nicht-PST-Variablen nicht ausreichen. Du kannst auch anhand von Bedingungen entscheiden, was geprüft werden soll: Wenn du beispielsweise eine Signatur untersuchen möchtest, prüfe zuerst, ob added_lines ~~~ enthält;
  • Generell ist es beim Umgang mit diesen Variablen immer viel besser, weitere Bedingungen zu verbrauchen, aber dafür die Berechnung aufwändiger Dinge zu vermeiden. Um dies zu erreichen, setze aufwendige Variablen immer als letzte Bedingungen.

Zu guter Letzt beachte, dass wenn eine Variable für einen bestimmten Filter berechnet wird, sie gespeichert wird und von jedem anderen Filter sofort abgerufen werden kann. Dies bedeutet, dass ein einzelner Filter, der diese Variable berechnet, etwa so viel zählt wie Dutzende von Filtern, die sie verwenden.

Schlüsselwörter

Wenn nicht ausdrücklich angegeben, wandeln Schlüsselwörter ihre Operanden in Zeichenketten um.

Für häufig verwendete Funktionen sind die folgenden speziellen Schlüsselwörter enthalten:

  • like (oder matches) gibt wahr zurück, wenn der linke Operand mit dem Glob-Muster im rechten Operanden übereinstimmt.
  • in gibt wahr zurück, wenn der rechte Operand (eine Zeichenkette) den linken Operanden enthält. Hinweis: Leere Zeichenketten sind in keiner anderen Zeichenkette enthalten und enthalten auch keine andere Zeichenkette (nicht einmal die leere Zeichenkette selbst).
  • contains funktioniert wie in, aber mit vertauschten linken und rechten Operanden. Hinweis: Leere Zeichenketten sind in keiner anderen Zeichenkette enthalten und enthalten auch keine andere Zeichenkette (nicht einmal die leere Zeichenkette selbst).
  • rlike (oder regex) und irlike geben wahr zurück, wenn der linke Operand mit dem Regex-Muster im rechten Operanden übereinstimmt (es enthält) (bei irlike wird die Groß-/Kleinschreibung nichtbeachtet).
    • Das System nutzt PCRE.
    • Die einzige aktivierte PCRE-Option ist PCRE_UTF8 (Modifikator u in PHP); für irlike sind sowohl PCRE_CASELESS als auch PCRE_UTF8 aktiviert (Modifikator iu).
  • if ... then ... end
  • if ... then ... else ... end
  • ... ? ... : ...
  • true, false, null

Beispiele

Code Ergebnis Anmerkung
"1234" like "12?4" True
"1234" like "12*" True
"foo" in "foobar" True
"foobar" contains "foo" True
"o" in ["foo", "bar"] True Aufgrund der Zeichenketten-Besetzung
"foo" regex "\w+" True
"a\b" regex "a\\\\b" True Um mithilfe regulärer Ausdrücke nach dem Auslassungszeichen Backslash zu suchen, musst du entweder vier Backslashs oder zwei \x5C verwenden. (Beides funktioniert gut.)
"a\b" regex "a\x5C\x5Cb" True

Funktionen

Zur Behebung einiger häufiger Probleme sind zahlreiche integrierte Funktionen enthalten. Sie werden im allgemeinen Format functionName( arg1, arg2, arg3 ) ausgeführt und können anstelle jedes Literals oder jeder Variablen verwendet werden. Ihre Argumente können als Literale, Variablen oder sogar als andere Funktionen angegeben werden.

Name Beschreibung
lcase Gibt das in Kleinbuchstaben umgewandelte Argument zurück.
ucase Gibt das in Großbuchstaben umgewandelte Argument zurück.
length Gibt die Länge der als Argument angegebenen Zeichenkette zurück. Wenn das Argument ein Array ist, gibt es seine Anzahl der Elemente zurück.
string Konvertiert in den Zeichenketten-Datentyp. Wenn das Argument ein Array ist, wird es durch Zeilenumbrüche getrennt.
int Konvertiert in den Ganzzahl-Datentyp.
float Konvertiert in den Gleitkommazahl-Datentyp.
bool Konvertiert in den booleschen Datentyp.
norm Äquivalent zu rmwhitespace(rmspecials(rmdoubles(ccnorm(arg1)))).
ccnorm Normalisiert verwechselbare/ähnliche Zeichen im Argument und gibt eine kanonische Form zurück. Eine Liste von Zeichen und ihren Ersetzungen findet sich auf Git, z. B. ccnorm( "Eeèéëēĕėęě3ƐƷ" ) === "EEEEEEEEEEEEE".[9] Die Ausgabe dieser Funktion ist immer in Großbuchstaben. Diese Funktion ist zwar nicht aufwendig, aber auch nicht einfach und könnte einen Filter verlangsamen, wenn sie oft aufgerufen wird.
ccnorm_contains_any Normalisiert verwechselbare/ähnliche Zeichen in allen seinen Argumenten und gibt wahr zurück, wenn die erste Zeichenkette eine beliebige Zeichenkette aus den folgenden Argumenten enthält (unbegrenzte Anzahl von Argumenten, logischer ODER-Modus). Eine Liste von Zeichen und ihren Ersetzungen findet sich auf Git. Aufgrund der Verwendung von ccnorm kann diese Funktion langsam sein, wenn zu viele Argumente übergeben werden.
ccnorm_contains_all Normalisiert verwechselbare/ähnliche Zeichen in allen seinen Argumenten und gibt wahr zurück, wenn die erste Zeichenkette jede Zeichenkette aus den folgenden Argumenten enthält (unbegrenzte Anzahl von Argumenten, logischer UND-Modus). Eine Liste von Zeichen und ihren Ersetzungen findet sich auf Git. Aufgrund der Verwendung von ccnorm kann diese Funktion langsam sein, wenn zu viele Argumente übergeben werden.
specialratio Gibt die Anzahl der nicht alphanumerischen Zeichen geteilt durch die Gesamtzahl der Zeichen im Argument zurück.
rmspecials Entfernt alle Sonderzeichen im Argument und gibt das Ergebnis zurück. Entfernt keine Leerzeichen. (Äquivalent zu s/[^\p{L}\p{N}\s]//g.)
rmdoubles Entfernt wiederholte Zeichen im Argument und gibt das Ergebnis zurück.
rmwhitespace Entfernt Leerzeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche).
count Gibt zurück, wie oft die Nadel (erste Zeichenkette) im Heuhaufen (zweite Zeichenkette) auftaucht. Wenn nur ein Argument angegeben ist, wird es durch Kommas getrennt und die Anzahl der Segmente zurückgegeben.
rcount Ähnlich wie count, aber die Nadel verwendet stattdessen einen regulären Ausdruck. Die Groß-/Kleinschreibung kann ignoriert werden, indem der reguläre Ausdruck mit "(?i)" begonnen wird. Bitte beachte, dass diese Funktion bei einfachen Zeichenketten bis zu 50-mal langsamer sein kann als count[10]. Verwende daher nach Möglichkeit diese Funktion.
get_matches MW 1.31+ Sucht nach Übereinstimmungen der Regex-Nadel (erste Zeichenkette) im Heuhaufen (zweite Zeichenkette). Gibt ein Array zurück, bei dem das Element 0 die gesamte Übereinstimmung und jedes Element [n] die Übereinstimmung der n-ten Erfassungsgruppe der Nadel ist. Die Groß-/Kleinschreibung kann ignoriert werden, indem der reguläre Ausdruck mit "(?i)" begonnen wird. Wenn eine Erfassungsgruppe nicht übereinstimmt, nimmt diese Array-Position den Wert falsch an.
ip_in_range Gibt wahr zurück, wenn die IP des Benutzers (erste Zeichenkette) mit dem angegebenen IP-Bereich (zweite Zeichenkette, kann in CIDR-Notation, expliziter Notation wie "1.1.1.1-2.2.2.2" oder eine einzelne IP sein) übereinstimmt. Funktioniert nur für anonyme Benutzer. Unterstützt sowohl IPv4- als auch IPv6-Adressen.
ip_in_ranges Gibt true zurück, wenn die IP des Benutzers (erste Zeichenkette) mit einem der angegebenen IP-Bereiche (folgende Zeichenketten in logischem ODER-Modus, kann in CIDR-Notation, expliziter Notation wie "1.1.1.1-2.2.2.2" oder eine einzelne IP sein) übereinstimmt. Funktioniert nur für anonyme Benutzer. Unterstützt sowohl IPv4- als auch IPv6-Adressen.
contains_any Gibt wahr zurück, wenn die erste Zeichenkette eine Zeichenkette aus den folgenden Argumenten enthält (unbegrenzte Anzahl von Argumenten in logischem ODER-Modus). Wenn das erste Argument ein Array ist, wird es in eine Zeichenkette umgewandelt.
contains_all Gibt wahr zurück, wenn die erste Zeichenkette jede Zeichenkette aus den folgenden Argumenten enthält (unbegrenzte Anzahl von Argumenten in logischem UND-Modus). Wenn das erste Argument ein Array ist, wird es in eine Zeichenkette umgewandelt.
equals_to_any Gibt wahr zurück, wenn das erste Argument mit einem der folgenden identisch (===) ist (unbegrenzte Anzahl von Argumenten). Grundsätzlich ist equals_to_any(a, b, c) dasselbe wie a===b | a===c, aber es ist kompakter und spart Bedingungen.
substr Gibt den Teil der ersten Zeichenkette nach dem Offset vom zweiten Argument (beginnt bei 0) und der maximalen Länge vom dritten Argument (optional) zurück.
strlen Gleich wie length.
strpos Gibt die numerische Position des ersten Vorkommens der Nadel (zweite Zeichenkette) im Heuhaufen (erste Zeichenkette) zurück, beginnend beim Offset vom dritten Arguments (optional, Standard ist 0). Diese Funktion kann 0 zurückgeben, wenn die Nadel am Anfang des Heuhaufens gefunden wird, sodass sie von einem anderen Vergleichsoperator als falscher Wert fehlinterpretiert werden könnte. Besser ist es, === oder !== zu verwenden, um zu testen, ob es gefunden wird. Differently from PHP's strpos(), which returns false when the needle is not found, this function returns -1 when the needle is not found.
str_replace Ersetzt alle Vorkommen der Such-Zeichenkette durch die Ersetzungs-Zeichenkette. Die Funktion nimmt drei Argumente in der folgenden Reihenfolge entgegen: Text, nach dem gesucht werden soll, zu suchender Text, Ersetzungstext.
str_replace_regexp Ersetzt mithilfe regulärer Ausdrücke alle Vorkommen der Such-Zeichenkette durch die Ersetzungs-Zeichenkette. Die Funktion nimmt drei Argumente in der folgenden Reihenfolge entgegen: Text, nach dem gesucht werden soll, übereinstimmender regulärer Ausdruck, Ersetzungstext.
rescape Gibt das Argument mit einigen Zeichen zurück, denen das Auslassungszeichen "\" vorangestellt ist, sodass die Zeichenkette in einem regulären Ausdruck verwendet werden kann, ohne dass diese Zeichen eine besondere Bedeutung haben.
set Legt eine Variable (erste Zeichenkette) mit einem gegebenen Wert (zweites Argument) zur weiteren Verwendung im Filter fest. Eine andere Syntax: name := value.
set_var Gleich wie set.

Beispiele

Code Ergebnis Anmerkung
length( "Wikipedia" ) 9
lcase( "WikiPedia" ) wikipedia
ccnorm( "w1k1p3d14" ) WIKIPEDIA Ausgabe von ccnorm ist immer in Großbuchstaben
ccnorm( "ωɨƙɩᑭƐƉ1α" ) WIKIPEDIA
ccnorm_contains_any( "w1k1p3d14", "wiKiP3D1A", "foo", "bar" ) true
ccnorm_contains_any( "w1k1p3d14", "foo", "bar", "baz" ) false
ccnorm_contains_any( "w1k1p3d14 is 4w3s0me", "bar", "baz", "some" ) true
ccnorm( "ìíîïĩїį!ľ₤ĺľḷĿ" ) IIIIIII!LLLLLL
norm( "!!ω..ɨ..ƙ..ɩ..ᑭᑭ..Ɛ.Ɖ@@1%%α!!" ) WIKIPEDAIA
norm( "F00 B@rr" ) FOBAR norm entfernt Leerzeichen, Sonderzeichen und Duplikate und verwendet dann 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
str_replace_regexp( "foobarbaz", "(.)a(.)", "$2a$1" ) foorabzab
ip_in_range( "127.0.10.0", "127.0.0.0/12" ) true
ip_in_ranges( "127.0.10.0", "10.0.0.0/8", "127.0.0.0/12" ) true
contains_any( "foobar", "x", "y", "f" ) true
get_matches( "(foo?ba+r) is (so+ good)", "fobaaar is soooo good to eat" ) ['fobaaar is soooo good', 'fobaaar', 'soooo good']

Reihenfolge von Operationen

Operationen werden grundsätzlich von links nach rechts ausgeführt, es gibt jedoch eine Reihenfolge, in der sie aufgelöst werden. Sobald der Filter eine der Bedingungen nicht erfüllt, wird die Überprüfung der übrigen Bedingungen abgebrochen (aufgrund der Kurzschlussauswertung) und mit dem nächsten Filter fortgefahren. Die Auswertungsreihenfolge ist:

  1. Alles, was in Klammern steht (( und )), wird als einzelne Einheit ausgewertet.
  2. Umwandeln von Variablen/Literalen in die entsprechenden Daten (z. B. page_namespace in 0)
  3. Funktionsaufrufe (norm, lcase usw.)
  4. Unäres + und - (definieren positive oder negative Werte, z. B. -1234, +1234)
  5. Schlüsselwörter (in, rlike usw.)
  6. Boolesche Umkehrung (!x)
  7. Potenzierung (2**3 → 8)
  8. Multiplikationsbezogenes (Multiplikation, Division, Modulo)
  9. Addition und Subtraktion (3-2 → 1)
  10. Vergleiche (<, >, ==)
  11. Boolesche Operationen (&, |, ^)
  12. Ternärer Operator (... ? ... : ...)
  13. Zuordnungen (:=)

Beispiele

  • A & B | C entspricht (A & B) | C, nicht A & (B | C). Insbesondere ergeben sowohl false & true | true als auch false & false | true true.
  • A | B & C entspricht (A | B) & C, nicht A | (B & C). Insbesondere ergeben sowohl true | true & false als auch true | false & false false.
  • added_lines rlike "foo" + "|bar" ist falsch, verwende stattdessen added_lines rlike ("foo" + "|bar").

Zählung von Bedingungen

Die Bedingungsgrenze entspricht (mehr oder weniger) der Anzahl der Vergleichsoperatoren + der Anzahl der eingegebenen Funktionsaufrufe.

Weitere Erläuterungen zur Reduzierung der verwendeten Bedingungen finden sich unter Erweiterung:Missbrauchsfilter/Bedingungen .

Ausnahmen

Obwohl die Prüffunktion des Missbrauchsfilters "Zurücksetzungs"-Aktionen als Bearbeitungen identifiziert, wertet der Missbrauchsfilter Zurücksetzungs-Aktionen nicht auf Übereinstimmung aus.[11]

Anmerkungen

  1. Der Vergleich von Arrays mit anderen Typen gibt immer falsch zurück, außer im obigen Beispiel
  2. 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Für das Hochladen von Dateien (action='upload') stehen aktuell nur die Variablen user_*, page_*, file_sha1, file_size, file_mime, file_mediatype, file_width, file_height, file_bits_per_channel zur Verfügung (die letzten fünf wurden erst seit der Veröffentlichung für MediaWiki 1.27 gerrit:281503 hinzugefügt). Alle Variablen mit file_* sind für andere Aktionen (einschließlich action='edit') nicht verfügbar.
  3. Seit MediaWiki 1.28 (gerrit:295254)
  4. Mehrere Filter (12), die diese Variable nutzen, wurden im Grafana-Dashboard AbuseFilterSlow angezeigt (zum Betrachten ist Logstash-Zugang erforderlich). Das Verschieben dieser Variable an das Ende des Filters hat anscheinend geholfen.
  5. Siehe phabricator:T191722
  6. Mit diesem Commit veraltet und mit diesem deaktiviert.
  7. Mehrere Filter, die diese Variable nutzen, wurden im Grafana-Dashboard AbuseFilterSlow angezeigt (Beispiel, zum Betrachten ist Logstash-Zugang erforderlich). Ziehe beispielsweise statt der Verwendung von "text" in edit_diff_pst (oder gar edit_diff) etwas wie "text" in added_lines & !("text" in removed_lines) in Erwägung
  8. Siehe den Quellcode für eine Liste von Typen.
  9. Bedenke phab:T27619. Du kannst Special:AbuseFilter/tools verwenden, um ccnorm( "your string" ) auszuwerten und so zu sehen, welche Zeichen konvertiert werden.
  10. https://3v4l.org/S6IGP
  11. T24713 - Zurücksetzung wird nicht von AF abgeglichen