Dieses Thema erklärt, wie man reguläre Ausdrücke (Regex) effektiv in der Discourse-Funktion Watched Words verwendet.
Bei Websites, die auf unserem Hosting laufen, sind diese Einstellungen ausgeblendet. Kunden mit kostenpflichtigen Hosting-Plänen können unser Support-Team unter
team@discourse.orgkontaktieren, um Regex für Watched Words anzufordern.
Hinweis: Diese Funktion ist auf unserem kostenlosen Hosting-Plan nicht verfügbar.
Reguläre Ausdrücke (Regex) sind ein mächtiges Werkzeug zur Definition von Suchmustern. Sie können Regex in der Funktion Watched Words verwenden, um die Genauigkeit und Flexibilität der Wortfilterung auf Ihrer Discourse-Seite zu verbessern.
Um reguläre Ausdrücke (Regex) in beobachteten Wörtern zu verwenden, müssen Sie zuerst die Site-Einstellung
watched words regular expressionsaktivieren.
Regex ist extrem mächtig und daher gefährlich. Eine falsch geschriebene Regex-Anweisung kann Probleme für Ihre Benutzer verursachen. Testen Sie Ihre Regex-Anweisungen auf Nicht-Produktionsinstanzen, bevor Sie diese live schalten.
Beispiel für Regex-Muster
Hier sind einige gängige Regex-Muster und wie sie eingesetzt werden können:
Groß-/Kleinschreibung ignorieren
Standardmäßig gleicht Discourse sowohl Groß- als auch Kleinschreibung eines Wortes ab.
thread
Dies findet thread, THREAD und thReAd.
Zeichenalternativen
Verwenden Sie Zeichenalternativen, um Ihre Übereinstimmungen zu erweitern.
(t|7)hr(3|e)(4|a)d
Dies findet alle obigen Fälle, plus thr3ad, 7hread und thr34d.
threads?\\b
Dies findet thread und threads, aber nicht threaded oder threading.
Wortgrenzen
Regex-Muster können unbeabsichtigt Teile von Wörtern finden. Verwenden Sie Wortgrenzen, um Teilübereinstimmungen zu vermeiden.
\bthreads?\b
Dies findet thread und threads, vermeidet aber Übereinstimmungen wie threadlike oder unthreading.
Umgang mit Unicode-Zeichen
Standard-Wortgrenzen funktionieren bei Unicode-Zeichen möglicherweise nicht. Erstellen Sie Grenzen für Zeichen, die von JavaScript-Regex nicht gut behandelt werden.
gr(ü|ue)(ß|ss)e
Dies findet alle gängigen Schreibweisen des Wortes grüße — einschließlich gruesse und GRÜSSE
Angenommen, Sie möchten das Wort Über blockieren, aber nicht Übersicht. Die Verwendung von Wortgrenzen wie \b(ü|ue)ber\b funktioniert nicht, da einige der JavaScript-Regex-Wort-Flags Unicode-Zeichen nicht behandeln. Stattdessen müssen Sie Ihre eigenen Grenzen erstellen.
(?:^|\s)(ü|ue)ber\b
Dies findet nun angemessen Über und ueber, aber nicht Übersicht oder uebersicht.
Gezielte Zeichensubstitutionen erfassen
Um Wörter zu erfassen, bei denen Benutzer Zahlen oder Sonderzeichen für Buchstaben ersetzen:
\bp[a@]ssw[o0]rd\b
Dies findet: password, p@ssword, passw0rd, p@ssw0rd, aber nicht mypassword oder password123
Umgang mit Zeichen mit dazwischenliegender Interpunktion
Um Versuche zu erfassen, Filter durch das Einfügen von Satzzeichen zu umgehen:
\bs\W*p\W*a\W*m\b
Dies findet: spam, s.p.a.m, s-p-a-m, aber nicht s_p_a_m (Unterstrich ist ein Wortzeichen), spammy oder myspam
Mehrere Wortvariationen abgleichen
Zum Abgleichen von Phrasen, die in verschiedenen Wortformen auftreten können:
\b(contact|email|reach)( us| me)?\b
Dies findet: contact, contact us, contact me, email, email us, email me, reach, reach us, reach me
Erkennen von E-Mail-Mustern
Um generische Muster von E-Mail-Adressen zu erfassen:
\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}\b
Dies findet: user@example.com, my.name@sub.domain.co.uk, user+tag@domain.org
Finden von Hashtag-Variationen
Um Hashtags mit unterschiedlicher Groß-/Kleinschreibung oder leichten Variationen abzugleichen:
\#(disc[o0]urse|f[o0]rum)\b
Dies findet: #discourse, #DISCOURSE, #disc0urse, #forum, #f0rum, aber nicht #discourseengine oder #forums
Erkennen sich wiederholender Muster
Um wiederholte Zeichen zu erfassen, die auf Spam-Inhalt hindeuten könnten:
([a-zA-Z])\1{3,}
Dies findet: aaaample, helllllo, yessssss, erkennt jeden Buchstaben, der 4 oder mehr Mal hintereinander wiederholt wird
URLs mit oder ohne Protokoll finden
\b(?:https?:\/\/)?[\w-]+(\.[\w-]+)+\b
Dies findet: example.com, sub.domain.org, https://discourse.org, http://meta.discourse.org
Vermeiden von verschachtelten Zeichenklassen
Korrekt:
(hold)?
Dies findet das optionale Wort „hold“ korrekt
Oder wenn Sie Zeichenalternativen wünschen:
[h][o0][l1][d]
Dies findet: hold, h0ld, ho1d, h01d
Falsch:
[h[o0][l1]d]?
Dies versucht fälschlicherweise, Zeichenklassen zu verschachteln, und findet jedes einzelne Zeichen aus h, o, 0, l, 1 oder d, was dazu führt, dass Wörter wie had, old usw. gefunden werden.
Verwendung von Klammern für optionale Wörter
Korrekt:
forum(s)?
Dies findet korrekt: forum, forums
Falsch:
forum[s]?
Dies findet „forum“, gefolgt von einem optionalen „s“, verwendet aber unnötigerweise eine Zeichenklasse.
Korrekte Verwendung von Zeichenklassen
Korrekt:
bad word
Um die Phrase „bad word“ zu finden
Oder als Beispiel für eine Zeichenklasse:
[bB][aA][dD]
Dies findet: bad, Bad, bAd, BAD usw.
Falsch:
[bad word]
Dies findet jedes einzelne Zeichen aus b, a, d, w, o, r oder d, nicht die Phrase „bad word“.
Effektiver Einsatz von Quantifizierern
\b[0-9]{3,5}\b
Dies findet Zahlen mit 3 bis 5 Ziffern: 123, 1234, 12345, aber nicht 12 oder 123456
Für spezifische sich wiederholende Muster:
(spam){2,3}
Dies findet: spamspam, spamspamspam
Ordnungsgemäße Anwendung von Wortgrenzen
Ohne Grenzen:
free
Dies findet: free, freedom, carefree
Mit Grenzen:
\bfree\b
Dies findet nur: free, aber nicht freedom oder carefree
Korrekter Umgang mit Unicode-Zeichen
Korrekter Ansatz:
(?:^|\s)(ö|oe)zel\b
Dies findet: özel, oezel an Wortgrenzen, auch bei Unicode-Zeichen
Falscher Ansatz:
\bözel\b
Dies funktioniert möglicherweise nicht korrekt mit dem türkischen Zeichen ö.
Zusätzliche Informationen
Sie können Regex-Ausdrücke auf https://regex101.com/ testen. Wenn Sie dies tun, stellen Sie sicher, dass Sie die Regex-Sprachversion auf ECMAScript umstellen.
Regex-Erfassungsgruppen-Rückreferenzen (z. B. \1 in Ersetzungszeichenfolgen) werden in den Ersetzungswerten von Watched Words nicht unterstützt. Die Aktionen „Ersetzen“ und „Verknüpfen“ unterstützen zwar Regex für den Abgleich, die Ersetzung ist jedoch immer eine Literalzeichenfolge.