Я бы не стал пытаться сделать спам-фильтр.Эта проблема уже хорошо решена многими другими, такими как SpamAssassin .
Однако решение может выглядеть примерно так, как это регулярное выражение, чтобы обнаружить длинную строку букв:
/\b[A-Za-z]{18,}\b/
Уточнение, позволяющее избежать ложных совпадений в допустимых 18-буквенных словах, состоит в проверке того, что редко встречается в обычных словах, например, заглавная буква, встречающаяся после строчной буквы:
/(?:[A-Z]*[a-z]+[A-Z])[A-Za-z]{18,}\b/
Это все еще можетдать несколько ложных совпадений (например, имя «SpamAssassin» всего лишь на несколько букв не соответствует этому регулярному выражению).Он будет работать правильно для предоставленных вами примеров и большинства обычных текстов - но не очень хорошо для примеров кода.
Обнаружение спама, как правило, использует много более сложных методов, которые невозможно воспроизвести, используя только регулярные выражения.Может быть, лучше взглянуть на другие показатели, такие как частота букв каждой буквы, и проверить, найдено ли слово в словаре.Часто нет единой методики, которая дает хорошие результаты - требуется комбинация техник с оценкой баллов для каждого.Если электронное письмо вызывает слишком много правил с высокой оценкой, оно помечается как спам, но если оно затрагивает только несколько правил с низкой оценкой, это может быть приемлемым.Систему оценки можно сделать настраиваемой пользователем.
Редактировать: Что касается обновления вопроса, поскольку для ввода данных в веб-форму одним из стандартных подходов для предотвращения спама является использование CAPTCHA например reCAPTCHA .