Ce sujet explique comment utiliser efficacement les expressions régulières (regex) dans la fonctionnalité Watched Words de Discourse.
Si votre site est hébergé par Discourse, veuillez contacter team@discourse.org si vous souhaitez activer ce paramètre.
Les expressions régulières (regex) sont un outil puissant pour définir des modèles de recherche. Vous pouvez utiliser les regex dans la fonctionnalité Watched Words pour améliorer la précision et la flexibilité du filtrage de mots sur votre site Discourse.
Pour utiliser des expressions régulières (regex) dans les mots surveillés, vous devez d’abord activer le paramètre du site
watched words regular expressions.
Les regex sont extrêmement puissantes et donc dangereuses. Une instruction regex mal écrite peut causer des problèmes à vos utilisateurs. Testez vos instructions regex sur des instances non-production avant de les mettre en ligne.
Exemples de modèles Regex
Voici quelques modèles regex courants et comment ils peuvent être employés :
Insensibilité à la casse
Par défaut, Discourse correspond aux formes majuscules et minuscules d’un mot.
thread
Ceci correspondra à thread, THREAD, et thReAd.
Alternatives de caractères
Utilisez des alternatives de caractères pour élargir vos correspondances.
(t|7)hr(3|e)(4|a)d
Ceci correspondra à tous les cas ci-dessus, plus thr3ad, 7hread, et thr34d.
threads?\\S+
Ceci correspondra à thread et threads mais pas à threaded ou threading.
Limites de mots
Les modèles regex peuvent accidentellement correspondre à des parties de mots. Utilisez des limites de mots pour éviter les correspondances partielles.
\\bthreads?\\b
Ceci correspond à thread et threads mais évite les correspondances comme threadlike ou unthreading.
Gestion des caractères Unicode
Les limites de mots standard peuvent échouer avec les caractères Unicode. Créez des limites pour les caractères qui ne sont pas bien gérés par les regex JavaScript.
gr(ü|ue)(ß|ss)e
Ceci correspond à toutes les formes couramment orthographiées du mot grüße — y compris gruesse et GRÜSSE
Supposons que vous vouliez bloquer le mot Über, mais pas Übersicht. L’utilisation de limites de mots comme \\b(ü|ue)ber\\b ne fonctionne pas car certains indicateurs de mots des regex JavaScript ne gèrent pas les caractères Unicode. Au lieu de cela, vous devez créer vos propres limites.
(?:^|\\s)(ü|ue)ber\\b
Ceci correspondra maintenant correctement à Über et ueber, mais pas à Übersicht ou uebersicht.
Capturer les substitutions de caractères délibérées
Pour capturer les mots où les utilisateurs substituent des chiffres ou des caractères spéciaux aux lettres :
\\bp[a@]ssw[o0]rd\\b
Ceci correspond à : password, p@ssword, passw0rd, p@ssw0rd, mais pas à mypassword ou password123
Gestion des caractères avec de la ponctuation entre les deux
Pour capturer les tentatives d’évasion des filtres en insérant de la ponctuation :
\\bs\\W*p\\W*a\\W*m\\b
Ceci correspond à : spam, s.p.a.m, s-p-a-m, s_p_a_m, mais pas à spammy ou myspam
Correspondance de plusieurs variations de mots
Pour faire correspondre des phrases qui peuvent apparaître avec différentes formes de mots :
\\b(contact|email|reach)( us| me)?\\b
Ceci correspond à : contact, contact us, contact me, email, email us, email me, reach, reach us, reach me
Détection de modèles d’adresses e-mail
Pour capturer les modèles génériques d’adresses e-mail :
\\b[\\w.%+-]+@[\\w.-]+\\.[a-zA-Z]{2,}\\b
Ceci correspond à : user@example.com, my.name@sub.domain.co.uk, user+tag@domain.org
Recherche de variations de hashtags
Pour faire correspondre les hashtags avec une casse différente ou de légères variations :
\\#(disc[o0]urse|f[o0]rum)\\b
Ceci correspond à : #discourse, #DISCOURSE, #disc0urse, #forum, #f0rum, mais pas à #discourseengine ou #forums
Détection de modèles répétitifs
Pour capturer les caractères répétés qui pourraient indiquer un contenu de spam :
([a-zA-Z])\\1{3,}
Ceci correspond à : aaaample, helllllo, yessssss, détectant toute lettre répétée 4 fois ou plus d’affilée.
Recherche d’URL avec ou sans protocole
\\b(?:https?:\\/\\/)?[\\w-]+(\\.[\\w-]+)+\\b
Ceci correspond à : example.com, sub.domain.org, https://discourse.org, http://meta.discourse.org
Éviter les classes de caractères imbriquées
Correct :
(hold)?
Ceci correspond correctement au mot optionnel “hold”
Ou si vous voulez des alternatives de caractères :
[h][o0][l1][d]
Ceci correspond à : hold, h0ld, ho1d, h01d
Incorrect :
[h[o0][l1]d]?
Ceci tente incorrectement d’imbriquer des classes de caractères et correspondra à n’importe quel caractère unique parmi h, o, 0, l, 1, ou d, ce qui fait qu’il correspond à des mots comme had, old, etc.
Utilisation des parenthèses pour les mots optionnels
Correct :
forum(s)?
Ceci correspond correctement à : forum, forums
Incorrect :
forum[s]?
Ceci correspond à “forum” suivi d’un “s” optionnel, mais utilise inutilement une classe de caractères.
Utilisation correcte des classes de caractères
Correct :
bad word
Pour faire correspondre la phrase “bad word”
Ou pour un exemple de classe de caractères :
[bB][aA][dD]
Ceci correspond à : bad, Bad, bAd, BAD, etc.
Incorrect :
[bad word]
Ceci correspond à n’importe quel caractère unique parmi b, a, d, w, o, r, ou d, et non à la phrase “bad word”.
Utilisation efficace des quantificateurs
\\b[0-9]{3,5}\\b
Ceci correspond aux nombres de 3 à 5 chiffres : 123, 1234, 12345, mais pas à 12 ou 123456
Pour des modèles répétitifs spécifiques :
(spam){2,3}
Ceci correspond à : spamspam, spamspamspam
Application correcte des limites de mots
Sans limites :
free
Ceci correspond à : free, freedom, carefree
Avec limites :
\\bfree\\b
Ceci correspond uniquement à : free, mais pas à freedom ou carefree
Gestion correcte des caractères Unicode
Approche correcte :
(?:^|\\s)(ö|oe)zel\\b
Ceci correspond à : özel, oezel aux limites de mots, même avec des caractères Unicode
Approche incorrecte :
\\bözel\\b
Ceci peut ne pas fonctionner correctement avec le caractère turc ö.
Informations supplémentaires
Vous pouvez tester les expressions Regex sur https://regex101.com/. Si vous le faites, assurez-vous de régler la saveur regex sur ECMAScript.
La capture et le remplacement Regex ne sont pas pris en charge dans Watched Words, uniquement la correspondance. Par conséquent, cela ne fonctionnera pas sur les actions de lien ou de remplacement.