Использование регулярных выражений с отслеживаемыми словами

:bookmark: Эта тема объясняет, как эффективно использовать регулярные выражения (regex) в функции Следящие слова на Discourse.>

:discourse: Для сайтов на нашем хостинге эти настройки скрыты. Клиенты с платными тарифами хостинга могут обратиться в нашу службу поддержки по адресу team@discourse.org, чтобы запросить использование regex с функцией «Следящие слова». Примечание: Эта функция недоступна в нашем бесплатном тарифе хостинга.

Регулярные выражения (regex) — это мощный инструмент для определения шаблонов поиска. Вы можете использовать regex в функции Следящие слова, чтобы повысить точность и гибкость фильтрации слов на вашем сайте Discourse.

:information_source: Чтобы использовать регулярные выражения (regex) в следящих словах, вы должны сначала включить настройку сайта watched words regular expressions.

:warning: Regex чрезвычайно мощный и, следовательно, опасный. Неправильно написанное регулярное выражение может вызвать проблемы у ваших пользователей. Протестируйте свои регулярные выражения на тестовых (не производственных) экземплярах перед запуском.

Примеры шаблонов regex

Вот некоторые распространенные шаблоны regex и способы их применения:

Регистронезависимость

По умолчанию Discourse совпадает как с заглавными, так и с прописными формами слова.

thread

Это будет совпадать с thread, THREAD и thReAd.

Альтернативы символов

Используйте альтернативы символов, чтобы расширить совпадения.

(t|7)hr(3|e)(4|a)d

Это будет совпадать со всеми случаями выше, а также с thr3ad, 7hread и thr34d.

threads?\b

Это будет совпадать с thread и threads, но не с threaded или threading.

Границы слов

Шаблоны regex могут непреднамеренно совпадать с частями слов. Используйте границы слов, чтобы избежать частичных совпадений.

\bthreads?\b

Это совпадает с thread и threads, но избегает совпадений вроде threadlike или unthreading.

Обработка символов Unicode

Стандартные границы слов могут не работать с символами Unicode. Создавайте границы для символов, которые плохо обрабатываются JavaScript regex.

gr(ü|ue)(ß|ss)e

Это совпадает со всеми распространенными вариантами написания слова grüße — включая gruesse и GRÜSSE.

Допустим, вы хотите заблокировать слово Über, но не Übersicht. Использование границ слов, таких как \b(ü|ue)ber\b, не работает, потому что некоторые флаги границ слов JavaScript regex не обрабатывают символы Unicode. Вместо этого вам нужно создать свои собственные границы.

(?:^|\s)(ü|ue)ber\b

Теперь это правильно совпадает с Über и ueber, но не с Übersicht или uebersicht.

Обнаружение умышленных замен символов

Чтобы обнаруживать слова, в которых пользователи заменяют буквы цифрами или специальными символами:

\bp[a@]ssw[o0]rd\b

Это совпадает с: password, p@ssword, passw0rd, p@ssw0rd, но не с mypassword или password123.

Обработка символов с пунктуацией между ними

Чтобы обнаруживать попытки обхода фильтров путем вставки пунктуации:

\bs\W*p\W*a\W*m\b

Это совпадает с: spam, s.p.a.m, s-p-a-m, но не с s_p_a_m (подчеркивание является символом слова), spammy или myspam.

Совпадение нескольких вариантов слов

Для совпадения фраз, которые могут появляться в разных словоформах:

\b(contact|email|reach)( us| me)?\b

Это совпадает с: contact, contact us, contact me, email, email us, email me, reach, reach us, reach me.

Обнаружение шаблонов email

Чтобы обнаруживать общие шаблоны адресов электронной почты:

\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}\b

Это совпадает с: user@example.com, my.name@sub.domain.co.uk, user+tag@domain.org.

Поиск вариантов хештегов

Чтобы совпадать с хештегами с разным регистром или незначительными вариациями:

\#(disc[o0]urse|f[o0]rum)\b

Это совпадает с: #discourse, #DISCOURSE, #disc0urse, #forum, #f0rum, но не с #discourseengine или #forums.

Обнаружение повторяющихся шаблонов

Чтобы обнаруживать повторяющиеся символы, которые могут указывать на спам:

([a-zA-Z])\1{3,}

Это совпадает с: aaaample, helllllo, yessssss, обнаруживая любую букву, повторяющуюся 4 и более раз подряд.

Поиск URL с протоколом или без него

\b(?:https?:\/\/)?[\w-]+(\.[\w-]+)+\b

Это совпадает с: example.com, sub.domain.org, https://discourse.org, http://meta.discourse.org.

Избегание вложенных классов символов

Правильно:

(hold)?

Это правильно совпадает с опциональным словом “hold”.

Или, если нужны альтернативы символов:

[h][o0][l1][d]

Это совпадает с: hold, h0ld, ho1d, h01d.

Неправильно:

[h[o0][l1]d]?

Это неправильно пытается вложить классы символов и будет совпадать с любым одним символом из h, o, 0, l, 1 или d, что приведет к совпадению таких слов, как had, old и т.д.

Использование скобок для опциональных слов

Правильно:

forum(s)?

Это правильно совпадает с: forum, forums.

Неправильно:

forum[s]?

Это совпадает с “forum”, за которым следует опциональный “s”, но использует класс символов необоснованно.

Правильное использование классов символов

Правильно:

bad word

Чтобы совпасть с фразой “bad word”.

Или пример класса символов:

[bB][aA][dD]

Это совпадает с: bad, Bad, bAd, BAD и т.д.

Неправильно:

[bad word]

Это совпадает с любым одним символом из b, a, d, w, o, r или d, а не с фразой “bad word”.

Эффективное использование квантификаторов

\b[0-9]{3,5}\b

Это совпадает с числами из 3 до 5 цифр: 123, 1234, 12345, но не с 12 или 123456.

Для конкретных повторяющихся шаблонов:

(spam){2,3}

Это совпадает с: spamspam, spamspamspam.

Правильное применение границ слов

Без границ:

free

Это совпадает с: free, freedom, carefree.

С границами:

\bfree\b

Это совпадает только с: free, но не с freedom или carefree.

Правильная обработка символов Unicode

Правильный подход:

(?:^|\s)(ö|oe)zel\b

Это совпадает с: özel, oezel на границах слов, даже с символами Unicode.

Неправильный подход:

\bözel\b

Это может не работать корректно с турецким символом ö.

Дополнительная информация

:information_source: Вы можете тестировать регулярные выражения на https://regex101.com/. Если вы это делаете, убедитесь, что переключили вариант регулярных выражений на ECMAScript.

Обратные ссылки на группы захвата regex (например, \1 в строках замены) не поддерживаются в значениях замены функции «Следящие слова». Действия замены и ссылки поддерживают regex для совпадения, но замена всегда является буквенной строкой.

13 лайков

Forgive my noobness, but I was not able to find the site setting for watched words regular expressions anywhere. I also looked for regex, regular expression, and other variants, but didn’t find anything that looked like it would enable regex for watched words. Do you have the slug to the site settings where this could be enabled (cloud hosted instance)?

EDIT the answer was just above and found here

2 лайка