Ce sujet explique comment utiliser efficacement les expressions régulières (regex) dans la fonctionnalité Mots surveillés de Discourse.
Pour les sites hébergés par nos soins, ces paramètres sont masqués. Les clients disposant d’un plan d’hébergement payant peuvent contacter notre équipe de support à l’adresse
team@discourse.orgpour demander l’utilisation de regex avec les Mots surveillés.
Remarque : Cette fonctionnalité n’est pas disponible sur notre plan d’hébergement gratuit.
Les expressions régulières (regex) sont un outil puissant pour définir des modèles de recherche. Vous pouvez utiliser des regex dans la fonctionnalité Mots surveillés pour améliorer la précision et la flexibilité du filtrage des mots sur votre site Discourse.
Pour utiliser les 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 puissants et donc dangereux. Une instruction regex mal écrite peut causer des problèmes à vos utilisateurs. Testez vos instructions regex sur des instances de préproduction avant de les déployer en production.
Exemples de modèles regex
Voici quelques modèles regex courants et leur utilisation :
Insensibilité à la casse
Par défaut, Discourse correspond aux formes majuscules et minuscules d’un mot.
thread
Cela correspondra à thread, THREAD et thReAd.
Alternances de caractères
Utilisez des alternances de caractères pour élargir vos correspondances.
(t|7)hr(3|e)(4|a)d
Cela correspondra à tous les cas ci-dessus, ainsi qu’à thr3ad, 7hread et thr34d.
threads?\b
Cela correspondra à thread et threads, mais pas à threaded ou threading.
Limites de mots
Les modèles regex peuvent involontairement correspondre à des parties de mots. Utilisez des limites de mots pour éviter les correspondances partielles.
\bthreads?\b
Cela correspond à thread et threads, mais évite des 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 mal gérés par les regex JavaScript.
gr(ü|ue)(ß|ss)e
Cela correspond à toutes les formes couramment orthographiées du mot grüße — y compris gruesse et GRÜSSE.
Disons que vous souhaitez 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 limites de mots des regex JavaScript ne gèrent pas correctement les caractères Unicode. Vous devez donc créer vos propres limites.
(?:^|\s)(ü|ue)ber\b
Cela correspondra maintenant correctement à Über et ueber, mais pas à Übersicht ou uebersicht.
Détection des substitutions délibérées de caractères
Pour repérer les mots où les utilisateurs substituent des chiffres ou des caractères spéciaux à des lettres :
\bp[a@]ssw[o0]rd\b
Cela correspond à : password, p@ssword, passw0rd, p@ssw0rd, mais pas à mypassword ou password123.
Gestion des caractères avec ponctuation intercalée
Pour repérer les tentatives de contournement des filtres en insérant de la ponctuation :
\bs\W*p\W*a\W*m\b
Cela correspond à : spam, s.p.a.m, s-p-a-m, mais pas à s_p_a_m (le trait de soulignement est un caractère de mot), spammy ou myspam.
Correspondance de multiples variations de mots
Pour correspondre à des phrases qui peuvent apparaître sous différentes formes de mots :
\b(contact|email|reach)( us| me)?\b
Cela 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 repérer des modèles génériques d’adresses e-mail :
\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}\b
Cela correspond à : user@example.com, my.name@sub.domain.co.uk, user+tag@domain.org.
Recherche de variations de hashtags
Pour correspondre à des hashtags avec une casse différente ou de légères variations :
\#(disc[o0]urse|f[o0]rum)\b
Cela correspond à : #discourse, #DISCOURSE, #disc0urse, #forum, #f0rum, mais pas à #discourseengine ou #forums.
Détection de modèles répétitifs
Pour repérer des caractères répétés qui pourraient indiquer du contenu spam :
([a-zA-Z])\1{3,}
Cela correspond à : aaaample, helllllo, yessssss, détectant toute lettre répétée 4 fois ou plus consécutivement.
Recherche d’URL avec ou sans protocole
\b(?:https?:\/\/)?[\w-]+(\.[\w-]+)+\b
Cela correspond à : example.com, sub.domain.org, https://discourse.org, http://meta.discourse.org.
Éviter les classes de caractères imbriquées
Correct :
(hold)?
Cela correspond correctement au mot optionnel “hold”.
Ou si vous souhaitez des alternances de caractères :
[h][o0][l1][d]
Cela correspond à : hold, h0ld, ho1d, h01d.
Incorrect :
[h[o0][l1]d]?
Cela 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 permet de correspondre à des mots comme had, old, etc.
Utilisation de parenthèses pour les mots optionnels
Correct :
forum(s)?
Cela correspond correctement à : forum, forums.
Incorrect :
forum[s]?
Cela 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 correspondre à la phrase “bad word”.
Ou pour un exemple de classe de caractères :
[bB][aA][dD]
Cela correspond à : bad, Bad, bAd, BAD, etc.
Incorrect :
[bad word]
Cela 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
Cela correspond à des nombres comportant de 3 à 5 chiffres : 123, 1234, 12345, mais pas à 12 ou 123456.
Pour des modèles répétitifs spécifiques :
(spam){2,3}
Cela correspond à : spamspam, spamspamspam.
Application correcte des limites de mots
Sans limites :
free
Cela correspond à : free, freedom, carefree.
Avec limites :
\bfree\b
Cela correspond uniquement à : free, mais pas à freedom ou carefree.
Gestion correcte des caractères Unicode
Approche correcte :
(?:^|\s)(ö|oe)zel\b
Cela correspond à : özel, oezel aux limites de mots, même avec des caractères Unicode.
Approche incorrecte :
\bözel\b
Cela peut ne pas fonctionner correctement avec le caractère turc ö.
Informations complémentaires
Vous pouvez tester les expressions régulières sur https://regex101.com/. Si vous le faites, assurez-vous de sélectionner le style de regex ECMAScript.
Les références arrière de groupes de capture regex (par exemple, \1 dans les chaînes de remplacement) ne sont pas prises en charge dans les valeurs de remplacement des Mots surveillés. Les actions de remplacement et de lien prennent en charge les regex pour la correspondance, mais le remplacement est toujours une chaîne littérale.