Este tema explica cómo usar eficazmente las expresiones regulares (regex) dentro de la función Palabras vigiladas de Discourse.
Para los sitios en nuestro alojamiento, estas configuraciones están ocultas. Los clientes con planes de alojamiento de pago pueden contactar a nuestro equipo de soporte en
team@discourse.orgpara solicitar el uso de regex con Palabras vigiladas.
Nota: Esta función no está disponible en nuestro plan de alojamiento gratuito.
Las expresiones regulares (regex) son una herramienta poderosa para definir patrones de búsqueda. Puedes usar regex en la función Palabras vigiladas para mejorar la precisión y flexibilidad del filtrado de palabras en tu sitio de Discourse.
Para usar expresiones regulares (regex) en las palabras vigiladas, primero debes activar la configuración del sitio
watched_words_regular_expressions.
Regex es extremadamente poderoso y, por tanto, peligroso. Una declaración regex escrita incorrectamente puede causar problemas a tus usuarios. Prueba tus declaraciones regex en instancias que no sean de producción antes de ponerlas en marcha.
Ejemplos de patrones Regex
Aquí tienes algunos patrones regex comunes y cómo pueden emplearse:
Insensibilidad a mayúsculas y minúsculas
Por defecto, Discourse coincide tanto con las formas en mayúsculas como en minúsculas de una palabra.
thread
Esto coincidirá con thread, THREAD y thReAd.
Alternativas de caracteres
Usa alternativas de caracteres para ampliar tus coincidencias.
(t|7)hr(3|e)(4|a)d
Esto coincidirá con todos los casos anteriores, además de thr3ad, 7hread y thr34d.
threads?\b
Esto coincidirá con thread y threads, pero no con threaded ni threading.
Límites de palabras
Los patrones regex pueden coincidir inadvertidamente con partes de palabras. Usa límites de palabras para evitar coincidencias parciales.
\bthreads?\b
Esto coincide con thread y threads, pero evita coincidencias como threadlike o unthreading.
Manejo de caracteres Unicode
Los límites de palabras estándar pueden fallar con caracteres Unicode. Crea límites para caracteres que JavaScript regex no maneja bien.
gr(ü|ue)(ß|ss)e
Esto coincide con todas las formas comúnmente escritas de la palabra grüße, incluyendo gruesse y GRÜSSE.
Digamos que quieres bloquear la palabra Über, pero no Übersicht. Usar límites de palabras como \b(ü|ue)ber\b no funciona porque algunas de las banderas de palabras de regex de JavaScript no manejan caracteres Unicode. En su lugar, debes crear tus propios límites.
(?:^|\s)(ü|ue)ber\b
Ahora esto coincidirá apropiadamente con Über y ueber, pero no con Übersicht ni uebersicht.
Detectar sustituciones deliberadas de caracteres
Para detectar palabras donde los usuarios sustituyen números o caracteres especiales por letras:
\bp[a@]ssw[o0]rd\b
Esto coincide con: password, p@ssword, passw0rd, p@ssw0rd, pero no con mypassword ni password123.
Manejo de caracteres con puntuación intermedia
Para detectar intentos de eludir filtros insertando puntuación:
\bs\W*p\W*a\W*m\b
Esto coincide con: spam, s.p.a.m, s-p-a-m, pero no con s_p_a_m (el guion bajo es un carácter de palabra), spammy ni myspam.
Coincidir múltiples variaciones de palabras
Para coincidir frases que puedan aparecer con diferentes formas de palabras:
\b(contact|email|reach)( us| me)?\b
Esto coincide con: contact, contact us, contact me, email, email us, email me, reach, reach us, reach me.
Detectar patrones de correo electrónico
Para detectar patrones genéricos de direcciones de correo electrónico:
\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}\b
Esto coincide con: user@example.com, my.name@sub.domain.co.uk, user+tag@domain.org.
Encontrar variaciones de hashtags
Para coincidir hashtags con diferentes mayúsculas/minúsculas o ligeras variaciones:
\#(disc[o0]urse|f[o0]rum)\b
Esto coincide con: #discourse, #DISCOURSE, #disc0urse, #forum, #f0rum, pero no con #discourseengine ni #forums.
Detectar patrones repetitivos
Para detectar caracteres repetidos que puedan indicar contenido spam:
([a-zA-Z])\1{3,}
Esto coincide con: aaaample, helllllo, yessssss, detectando cualquier letra repetida 4 o más veces consecutivamente.
Encontrar URLs con o sin protocolo
\b(?:https?:\/\/)?[\w-]+(\.[\w-]+)+\b
Esto coincide con: example.com, sub.domain.org, https://discourse.org, http://meta.discourse.org.
Evitar clases de caracteres anidadas
Correcto:
(hold)?
Esto coincide correctamente con la palabra opcional “hold”.
O si quieres alternativas de caracteres:
[h][o0][l1][d]
Esto coincide con: hold, h0ld, ho1d, h01d.
Incorrecto:
[h[o0][l1]d]?
Esto intenta incorrectamente anidar clases de caracteres y coincidirá con cualquier carácter individual de h, o, 0, l, 1 o d, haciendo que coincida con palabras como had, old, etc.
Usar paréntesis para palabras opcionales
Correcto:
forum(s)?
Esto coincide correctamente con: forum, forums.
Incorrecto:
forum[s]?
Esto coincide con “forum” seguido de un “s” opcional, pero usa una clase de caracteres innecesariamente.
Uso correcto de clases de caracteres
Correcto:
bad word
Para coincidir con la frase “bad word”.
O para un ejemplo de clase de caracteres:
[bB][aA][dD]
Esto coincide con: bad, Bad, bAd, BAD, etc.
Incorrecto:
[bad word]
Esto coincide con cualquier carácter individual de b, a, d, w, o, r o d, no con la frase “bad word”.
Usar cuantificadores eficazmente
\b[0-9]{3,5}\b
Esto coincide con números de 3 a 5 dígitos: 123, 1234, 12345, pero no con 12 ni 123456.
Para patrones repetitivos específicos:
(spam){2,3}
Esto coincide con: spamspam, spamspamspam.
Aplicar límites de palabras correctamente
Sin límites:
free
Esto coincide con: free, freedom, carefree.
Con límites:
\bfree\b
Esto coincide solo con: free, pero no con freedom ni carefree.
Manejo correcto de caracteres Unicode
Enfoque correcto:
(?:^|\s)(ö|oe)zel\b
Esto coincide con: özel, oezel en límites de palabras, incluso con caracteres Unicode.
Enfoque incorrecto:
\bözel\b
Esto puede no funcionar correctamente con el carácter turco ö.
Información adicional
Puedes probar expresiones Regex en https://regex101.com/. Si lo haces, asegúrate de cambiar el estilo de regex a ECMAScript.
Las referencias inversas de grupos de captura de Regex (por ejemplo, \1 en cadenas de reemplazo) no son compatibles en los valores de reemplazo de Palabras vigiladas. Las acciones de reemplazo y enlace sí admiten regex para la coincidencia, pero el reemplazo siempre es una cadena literal.