Здесь нужно учесть несколько вещей:
- Хотите ли вы добавить или удалить слова из этого черного списка позже? В этом случае имеет смысл сделать это только перед тем, как показывать сообщение, но сохранить исходное сообщение.
- Хотите ли вы иметь копию сообщения позже (например, по юридическим причинам или в службе поддержки)? Тогда также имеет смысл сохранить сообщение без изменений в базе данных.
Так что я бы сохранил сообщение в базе данных и проанализировал его только перед его рендерингом. Для меня это выглядит как наиболее эффективный способ сделать это:
- Сохраните черный список в индексированном столбце (строчные буквы) в базе данных и возвращайте комментарии через хранимую процедуру, которая фильтрует его
- Храните черный список в нижнем регистре в некоторой структуре данных, которая обеспечивает эффективный доступ (например, словарь) в памяти на среднем уровне.
В обоих случаях вы просто просматриваете каждый комментарий и фильтруете его. Последний способ более прост в реализации, но он означает, что вам придется хранить список в памяти, который теряет смысл, когда у вас очень большой черный список.
(На самом деле я не вижу смысла в использовании регулярных выражений.)