Эта тема объясняет, как эффективно использовать регулярные выражения (regex) в функции Следящие слова на Discourse.>
Для сайтов на нашем хостинге эти настройки скрыты. Клиенты с платными тарифами хостинга могут обратиться в нашу службу поддержки по адресу
team@discourse.org, чтобы запросить использование regex с функцией «Следящие слова». Примечание: Эта функция недоступна в нашем бесплатном тарифе хостинга.
Регулярные выражения (regex) — это мощный инструмент для определения шаблонов поиска. Вы можете использовать regex в функции Следящие слова, чтобы повысить точность и гибкость фильтрации слов на вашем сайте Discourse.
Чтобы использовать регулярные выражения (regex) в следящих словах, вы должны сначала включить настройку сайта
watched words regular expressions.
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
Это может не работать корректно с турецким символом ö.
Дополнительная информация
Вы можете тестировать регулярные выражения на https://regex101.com/. Если вы это делаете, убедитесь, что переключили вариант регулярных выражений на ECMAScript.
Обратные ссылки на группы захвата regex (например, \1 в строках замены) не поддерживаются в значениях замены функции «Следящие слова». Действия замены и ссылки поддерживают regex для совпадения, но замена всегда является буквенной строкой.