Борьба со спамом и регулярные выражения PHP

Статьи -> Программирование -> PHP

Борьба со спамом и регулярные выражения PHP

v:1.1 07.02.2010

Борьба со спамом в комментариях на сайтах для многих веб-мастеров превращается в головную боль. С одной стороны, антиспамовые фильтры и барьеры можно усложнить и спама не будет, но не будет и комментариев. А с другой стороны, если антиспамовые фильтры убрать совсем, то от спамеров отбоя не будет. Надо найти некую золотую середину, чтобы и спама было поменьше и пользователям было удобно.

В интернете можно найти много способов борьбы со спамом: это и обязательная регистрация и премодерация комментариев и разного рода captcha. Однако все это не очень удобно.

Для борьбы со спамом хорошо подходят регулярные выражения.
Вот что Викпедия говорит про регулярные выражения:

Регулярные выражения (англ. regular expressions, сокр. RegExp, RegEx, жарг. регэкспы или регексы) - система синтаксического разбора текстовых фрагментов по формализованному шаблону, основанная на системе записи образцов для поиска. Образец (англ. pattern), задающий правило поиска, по-русски также иногда называют "шаблоном", "маской". Регулярные выражения произвели прорыв в электронной обработке текста в конце XX века. Они являются развитием символов-джокеров (англ. wildcard characters).

Т.е. регулярные выражения - это средство, с помощью которого можно находить в тексте фрагменты, соответствующие заданному условию.

Один из вариантов определения спама в комментариях - это нахождение в тексте слов и фраз, характерных для сообщений спамера.
Практически все такие сообщения содержат в теле адрес сайта. Вот по адресу сайта можно и организовать фильтрацию. Т.е. если в комментариях присутствует адрес сайта, значит это сообщение спамера.
Конечно, это накладывает дополнительные ограничения и создает неудобства добропорядочным пользователям, но это можно сгладить организационными мерами. Во-первых, четко прописать правила добавления комментариев, с обязательным указанием на недопустимость адресов сайтов, во-вторых, зарегистрированным пользователям все-таки разрешать вставлять адреса сайтов.

Определять наличие адреса сайта в тексте комментария можно таким регулярным выражением:



Это регулярное выражение описывает следующие случаи:

  • Строка начинается с "http:// (https://)" или c "www".
  • Состоит из хотя бы одного слова, которе составляют буквы латинского алфавита и знаки "-", "_" и которое заканчивается точкой.
  • В составе строки должо быть слово, которе составляют буквы латинского алфавита и знаки "-", "_", слово должно быть не меньше 2 и не больше 4 букв.
  • Строка может заканчиваться словом, состоящим из цифр и знака ":"
  • Строка может заканчиваться знаком "/"
Т.е. этому выражению соответствуют следующие случаи:
  • http://spam.ru
  • http://www.spam.ru
  • www.spam.ru
  • www.spam.smam.ru/
  • www.spam.smam.ru:8080/
Конечно же, приведенное регулярное выражение не отсеивает все возможны варианты адресов сайтов, но достаточное количество.

Кстати, для изучения регулярных выражений рекомендую эту статью.
А для ускорения составления удобно пользоваться конструктором регулярных выражений на этом сайте.

В языке PHP есть все необходимые средства для работы с регулярными выражениями.
Вот как будет выглядеть код для требуемого шаблона:



Код основан на PHP функции mb_eregi, думаю не требует пояснений.

Описанный выше способ борьбы со спамом технически просто, но в то же время достаточно эффективен и доставляет минимум неудобств пользователям.

Петрелевич Сергей
petrelevich@yandex.ru
www.SmartyIT.ru

Метки: PHP   Web   Регулярные выражения  

Комментарии.

Внимание.
Комментировать могут только зарегистрированные пользователи.
Возможно использование следующих HTML тегов: <a>, <b>, <i>, <br>.

rezwyi Aug 2, 2010 9:37:39 AM
Интересно, почитал. Спасибо за информацию.
 
Petrelevich Aug 2, 2010 9:26:48 PM
Казалось бы простой способ, а еще ни одного спамерского сообщения не было. Посмотрим, как дальше будет.
 
Аноним Oct 5, 2010 9:04:16 PM
Это спам spam.ru
 
Petrelevich Oct 5, 2010 9:24:23 PM
Это спам spam.ru
Спасибо за замечание, исправил выражение.
 
Яндекс цитирования Ðåéòèíã@Mail.ru Rambler's Top100