Вопрос о регулярном выражении для новичков - обнаружение спама - PullRequest
2 голосов
/ 14 ноября 2009

Вот мои новые вопросы о регулярных выражениях:

  • Как я могу проверить, есть ли в строке 3 спам-слова? (например: виагра, таблетки и магазин)
  • Как я могу также обнаружить варианты таких спам-слов, как "v-iagra" или "v.iagra"? (один дополнительный символ)

Ответы [ 2 ]

3 голосов
/ 14 ноября 2009

Regex не совсем подходящий молоток для этого конкретного гвоздя. Для вашего списка вы можете просто выбросить все слова из черного списка в какой-то отсортированный список и отсканировать каждый токен по этому списку. Прямые строковые операции всегда быстрее, чем вызов механизма регулярных выражений du jour.

Для ваших вариантов ("v-iagra" и др.) Я удалил бы все не-символы (как предложено @Kinopiko) и затем снова пропустил их через черный список. Если вы настороженно относитесь к таким вещам, как «виагра» и так далее, я бы проверил Аспелл ​​. Это отличная библиотека, и похоже, что CPAN имеет привязку Perl.

2 голосов
/ 14 ноября 2009

Как я могу проверить, есть ли в строке 3 спам-слова? (например: виагра, таблетки и магазин)

Регулярное выражение для определения любого из этих трех слов может выглядеть так (Perl):

if ($string =~ /(viagra|pills|shop)/) {
    # spam
}

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

my $bad_words = 0;
while ($string =~ /(viagra|pills|shop)/g) {
     $bad_words++;
}
if ($bad_words >= 3) {
     # spam
}

Как я могу также обнаружить варианты таких спам-слов, как "v-iagra" или "v.iagra"? (один дополнительный символ)

Это не так просто сделать с помощью регулярного выражения. Вы можете попробовать что-то вроде

 $string =~ s/\W//g;

чтобы удалить все несловарные символы, такие как. и -, а затем проверьте строку с помощью теста выше. Это тоже лишит пробелов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...