Questo argomento spiega come utilizzare efficacemente le espressioni regolari (regex) nella funzionalitĂ Parole Osservate di Discourse.
Per i siti ospitati da noi, queste impostazioni sono nascoste. I clienti con piani di hosting a pagamento possono contattare il nostro team di supporto all’indirizzo
team@discourse.orgper richiedere l’uso di regex con le Parole Osservate.
Nota: Questa funzionalità non è disponibile nel piano di hosting Gratuito.
Le espressioni regolari (regex) sono uno strumento potente per definire modelli di ricerca. Puoi utilizzare le regex nella funzionalitĂ Parole Osservate per migliorare precisione e flessibilitĂ nel filtraggio delle parole sul tuo sito Discourse.
Per utilizzare le espressioni regolari (regex) nelle parole osservate, devi prima attivare l’impostazione del sito
watched_words_regular_expressions.
Le regex sono estremamente potenti e quindi pericolose. Una dichiarazione regex scritta in modo errato può causare problemi agli utenti. Testa le tue espressioni regex su istanze non di produzione prima di metterle in produzione.
Esempi di pattern Regex
Ecco alcuni pattern regex comuni e come possono essere utilizzati:
InsensibilitĂ alle maiuscole/minuscole
Per impostazione predefinita, Discourse corrisponde sia le forme maiuscole che minuscole di una parola.
thread
Questo corrisponderĂ a thread, THREAD e thReAd.
Alternative di caratteri
Utilizza le alternative di caratteri per espandere le tue corrispondenze.
(t|7)hr(3|e)(4|a)d
Questo corrisponderĂ a tutti i casi sopra riportati, oltre a thr3ad, 7hread e thr34d.
threads?\b
Questo corrisponderĂ a thread e threads, ma non a threaded o threading.
Confini di parola
I pattern regex possono corrispondere involontariamente parti di parole. Utilizza i confini di parola per evitare corrispondenze parziali.
\bthreads?\b
Questo corrisponde a thread e threads, ma evita corrispondenze come threadlike o unthreading.
Gestione dei caratteri Unicode
I confini di parola standard potrebbero non funzionare con i caratteri Unicode. Crea confini per i caratteri non gestiti correttamente dalle regex di JavaScript.
gr(ĂĽ|ue)(Ăź|ss)e
Questo corrisponde a tutte le forme comunemente scritte della parola grüße — inclusi gruesse e GRÜSSE.
Supponiamo di voler bloccare la parola Über, ma non Übersicht. Utilizzare confini di parola come \b(ü|ue)ber\b non funziona perché alcuni flag delle regex di JavaScript non gestiscono i caratteri Unicode. Invece, devi creare i tuoi confini.
(?:^|\s)(ĂĽ|ue)ber\b
Questo corrisponderĂ ora correttamente a Ăśber e ueber, ma non a Ăśbersicht o uebersicht.
Cattura di sostituzioni intenzionali di caratteri
Per catturare parole in cui gli utenti sostituiscono numeri o caratteri speciali con lettere:
\bp[a@]ssw[o0]rd\b
Questo corrisponde a: password, p@ssword, passw0rd, p@ssw0rd, ma non a mypassword o password123.
Gestione di caratteri con punteggiatura intermedia
Per catturare tentativi di eludere i filtri inserendo punteggiatura:
\bs\W*p\W*a\W*m\b
Questo corrisponde a: spam, s.p.a.m, s-p-a-m, ma non a s_p_a_m (l’underscore è un carattere di parola), spammy o myspam.
Corrispondenza di piĂą varianti di parole
Per corrispondere frasi che potrebbero apparire con diverse forme di parole:
\b(contact|email|reach)( us| me)?\b
Questo corrisponde a: contact, contact us, contact me, email, email us, email me, reach, reach us, reach me.
Rilevamento di pattern di email
Per catturare pattern generici di indirizzi email:
\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}\b
Questo corrisponde a: user@example.com, my.name@sub.domain.co.uk, user+tag@domain.org.
Trovare varianti di hashtag
Per corrispondere hashtag con diverse maiuscole/minuscole o leggere varianti:
\#(disc[o0]urse|f[o0]rum)\b
Questo corrisponde a: #discourse, #DISCOURSE, #disc0urse, #forum, #f0rum, ma non a #discourseengine o #forums.
Rilevamento di pattern ripetitivi
Per catturare caratteri ripetuti che potrebbero indicare contenuti spam:
([a-zA-Z])\1{3,}
Questo corrisponde a: aaaample, helllllo, yessssss, rilevando qualsiasi lettera ripetuta 4 o piĂą volte di seguito.
Trovare URL con o senza protocollo
\b(?:https?:\/\/)?[\w-]+(\.[\w-]+)+\b
Questo corrisponde a: example.com, sub.domain.org, https://discourse.org, http://meta.discourse.org.
Evitare classi di caratteri nidificate
Corretto:
(hold)?
Questo corrisponde correttamente alla parola opzionale “hold”.
Oppure, se desideri alternative di caratteri:
[h][o0][l1][d]
Questo corrisponde a: hold, h0ld, ho1d, h01d.
Errato:
[h[o0][l1]d]?
Questo tenta erroneamente di nidificare classi di caratteri e corrisponderĂ a qualsiasi singolo carattere tra h, o, 0, l, 1 o d, facendo corrispondere parole come had, old, ecc.
Utilizzo delle parentesi per parole opzionali
Corretto:
forum(s)?
Questo corrisponde correttamente a: forum, forums.
Errato:
forum[s]?
Questo corrisponde a “forum” seguito da un “s” opzionale, ma utilizza una classe di caratteri inutilmente.
Uso corretto delle classi di caratteri
Corretto:
bad word
Per corrispondere la frase “bad word”.
Oppure, per un esempio di classe di caratteri:
[bB][aA][dD]
Questo corrisponde a: bad, Bad, bAd, BAD, ecc.
Errato:
[bad word]
Questo corrisponde a qualsiasi singolo carattere tra b, a, d, w, o, r o d, non alla frase “bad word”.
Utilizzo efficace dei quantificatori
\b[0-9]{3,5}\b
Questo corrisponde a numeri con 3-5 cifre: 123, 1234, 12345, ma non a 12 o 123456.
Per pattern ripetitivi specifici:
(spam){2,3}
Questo corrisponde a: spamspam, spamspamspam.
Applicazione corretta dei confini di parola
Senza confini:
free
Questo corrisponde a: free, freedom, carefree.
Con confini:
\bfree\b
Questo corrisponde solo a: free, ma non a freedom o carefree.
Gestione corretta dei caratteri Unicode
Approccio corretto:
(?:^|\s)(ö|oe)zel\b
Questo corrisponde a: özel, oezel ai confini di parola, anche con caratteri Unicode.
Approccio errato:
\bözel\b
Questo potrebbe non funzionare correttamente con il carattere turco ö.
Ulteriori informazioni
Puoi testare le espressioni regex su https://regex101.com/. Se lo fai, assicurati di passare il flavor regex a ECMAScript.
I riferimenti inversi ai gruppi di cattura delle regex (ad esempio, \1 nelle stringhe di sostituzione) non sono supportati nei valori di sostituzione delle Parole Osservate. Le azioni di sostituzione e collegamento supportano le regex per la corrispondenza, ma la sostituzione è sempre una stringa letterale.