Este tópico explica como usar efetivamente expressões regulares (regex) no recurso Palavras Observadas do Discourse.
Para sites em nossa hospedagem, essas configurações estão ocultas. Clientes em planos de hospedagem pagos podem entrar em contato com nossa equipe de suporte em
team@discourse.orgpara solicitar regex com Palavras Observadas.
Nota: Este recurso não está disponível no nosso plano de hospedagem gratuito.
Expressões regulares (regex) são uma ferramenta poderosa para definir padrões de pesquisa. Você pode usar regex no recurso Palavras Observadas para aprimorar a precisão e a flexibilidade da filtragem de palavras em seu site Discourse.
Para usar expressões regulares (regex) em palavras observadas, você deve primeiro ativar a configuração do site
watched_words_regular_expressions.
Regex é extremamente poderoso e, portanto, perigoso. Uma expressão regex mal escrita pode causar problemas para seus usuários. Teste suas expressões regex em instâncias de não produção antes de colocar em produção.
Exemplos de padrões Regex
Aqui estão alguns padrões regex comuns e como eles podem ser empregados:
Insensibilidade a maiúsculas e minúsculas
Por padrão, o Discourse corresponde tanto às formas maiúsculas quanto às minúsculas de uma palavra.
thread
Isso corresponderá a thread, THREAD e thReAd.
Alternativas de caracteres
Use alternativas de caracteres para expandir suas correspondências.
(t|7)hr(3|e)(4|a)d
Isso corresponderá a todos os casos acima, além de thr3ad, 7hread e thr34d.
threads?\b
Isso corresponderá a thread e threads, mas não a threaded ou threading.
Limites de palavra
Padrões regex podem, sem querer, corresponder a partes de palavras. Use limites de palavra para evitar correspondências parciais.
\bthreads?\b
Isso corresponde a thread e threads, mas evita correspondências como threadlike ou unthreading.
Lidando com caracteres Unicode
Limites de palavra padrão podem falhar com caracteres Unicode. Crie limites para caracteres não tratados adequadamente pelo regex do JavaScript.
gr(ü|ue)(ß|ss)e
Isso corresponde a todas as formas comumente escritas da palavra grüße — incluindo gruesse e GRÜSSE.
Digamos que você queira bloquear a palavra Über, mas não Übersicht. Usar limites de palavra como \b(ü|ue)ber\b não funciona porque algumas das flags de palavra do regex do JavaScript não lidam bem com caracteres Unicode. Em vez disso, você precisa criar seus próprios limites.
(?:^|\s)(ü|ue)ber\b
Isso agora corresponderá adequadamente a Über e ueber, mas não a Übersicht ou uebersicht.
Capturando substituições deliberadas de caracteres
Para capturar palavras onde usuários substituem números ou caracteres especiais por letras:
\bp[a@]ssw[o0]rd\b
Isso corresponde a: password, p@ssword, passw0rd, p@ssw0rd, mas não a mypassword ou password123.
Lidando com caracteres com pontuação entre eles
Para capturar tentativas de contornar filtros inserindo pontuação:
\bs\W*p\W*a\W*m\b
Isso corresponde a: spam, s.p.a.m, s-p-a-m, mas não a s_p_a_m (o sublinhado é um caractere de palavra), spammy ou myspam.
Correspondendo a múltiplas variações de palavras
Para corresponder a frases que podem aparecer com diferentes formas de palavras:
\b(contact|email|reach)( us| me)?\b
Isso corresponde a: contact, contact us, contact me, email, email us, email me, reach, reach us, reach me.
Detectando padrões de e-mail
Para capturar padrões genéricos de endereço de e-mail:
\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}\b
Isso corresponde a: user@example.com, my.name@sub.domain.co.uk, user+tag@domain.org.
Encontrando variações de hashtags
Para corresponder a hashtags com diferentes maiúsculas/minúsculas ou pequenas variações:
\#(disc[o0]urse|f[o0]rum)\b
Isso corresponde a: #discourse, #DISCOURSE, #disc0urse, #forum, #f0rum, mas não a #discourseengine ou #forums.
Detectando padrões repetitivos
Para capturar caracteres repetidos que podem indicar conteúdo spam:
([a-zA-Z])\1{3,}
Isso corresponde a: aaaample, helllllo, yessssss, detectando qualquer letra repetida 4 ou mais vezes consecutivamente.
Encontrando URLs com ou sem protocolo
\b(?:https?:\/\/)?[\w-]+(\.[\w-]+)+\b
Isso corresponde a: example.com, sub.domain.org, https://discourse.org, http://meta.discourse.org.
Evitando classes de caracteres aninhadas
Correto:
(hold)?
Isso corresponde corretamente à palavra opcional “hold”.
Ou, se quiser alternativas de caracteres:
[h][o0][l1][d]
Isso corresponde a: hold, h0ld, ho1d, h01d.
Incorreto:
[h[o0][l1]d]?
Isso tenta incorretamente aninhar classes de caracteres e corresponderá a qualquer caractere único de h, o, 0, l, 1 ou d, fazendo com que corresponda a palavras como had, old, etc.
Usando parênteses para palavras opcionais
Correto:
forum(s)?
Isso corresponde corretamente a: forum, forums.
Incorreto:
forum[s]?
Isso corresponde a “forum” seguido de um “s” opcional, mas usa uma classe de caracteres desnecessariamente.
Uso adequado de classes de caracteres
Correto:
bad word
Para corresponder à frase “bad word”.
Ou para um exemplo de classe de caracteres:
[bB][aA][dD]
Isso corresponde a: bad, Bad, bAd, BAD, etc.
Incorreto:
[bad word]
Isso corresponde a qualquer caractere único de b, a, d, w, o, r ou d, não à frase “bad word”.
Usando quantificadores efetivamente
\b[0-9]{3,5}\b
Isso corresponde a números com 3 a 5 dígitos: 123, 1234, 12345, mas não a 12 ou 123456.
Para padrões repetitivos específicos:
(spam){2,3}
Isso corresponde a: spamspam, spamspamspam.
Aplicando limites de palavra corretamente
Sem limites:
free
Isso corresponde a: free, freedom, carefree.
Com limites:
\bfree\b
Isso corresponde apenas a: free, mas não a freedom ou carefree.
Lidando corretamente com caracteres Unicode
Abordagem correta:
(?:^|\s)(ö|oe)zel\b
Isso corresponde a: özel, oezel em limites de palavra, mesmo com caracteres Unicode.
Abordagem incorreta:
\bözel\b
Isso pode não funcionar corretamente com o caractere turco ö.
Informações Adicionais
Você pode testar expressões Regex em https://regex101.com/. Se fizer isso, certifique-se de alternar o sabor do regex para ECMAScript.
As referências posteriores a grupos de captura de Regex (por exemplo, \1 em strings de substituição) não são suportadas nos valores de substituição de Palavras Observadas. As ações de substituir e vincular suportam regex para correspondência, mas a substituição é sempre uma string literal.