Проверьте, содержит ли строка спам-слова

Я пытаюсь реализовать немного кода, найденного при переполнении стека, который покрывает фильтр спам-слов. Когда я просто набираю спам-слово, функция работает, однако, когда я печатаю кучу текста до того, как оно будет пропущено. Я проверил источник, и я должен что-то упустить, может ли кто-нибудь помочь?

код:

function strpos_arr($haystack, $needle) {
 if(!is_array($needle)) $needle = array($needle);
 foreach($needle as $what) {
 if(($pos = strpos($haystack, $what))!==false) return $pos;
}
return false;
}

функция, которую я называю:

if(strpos_arr($text, $bad_words)) {
 return false;
 } else {
 return true;
 }

массив - это просто массив с множеством плохих слов:

$bad_words = array(
 'bad word 1',
 'bad word 2');

ссылка на оригинальную статью: использование массива в виде игл в strpos

благодаря

2 ответа

Во-первых, похоже, что ваша логика неправильна. Я думаю:

if(strpos_arr($text, $bad_words)) {
 return false;
} else {
 return true;
}

должно быть:

if (strpos_arr($text, $bad_words)) {
 return TRUE;
} else {
 return FALSE;
}

Затем вы возвращаете $pos если найдено плохое слово. Если $pos окажется равным нулю, он откажется от следующей проверки. Если вам не нужно знать положение плохого слова в тексте, я бы изменил его на:

if (($pos = strpos($haystack, $what)) !== FALSE) return TRUE;


Функция strpos_arr возвращает позицию первой "иглы", найденной в строке:

if(($pos = strpos($haystack, $what))!==false) return $pos;

или false если в тексте нет "игл".

Это означает, что strpos_arr($text, $bad_words) возвращает false если в тексте есть плохие слова. В противном случае он возвращает целое число с положением первого плохого слова в строке.

Обратите внимание, что когда текст начинается с плохого слова, он возвращает 0, что эквивалентно false. Поэтому, когда вы просто вводите спам-слово, функция работает, когда я набираю кучу текста до того, как оно будет отправлено спам-словом ".

Вы можете реализовать функцию, чтобы найти такие плохие слова:

function has_bad_word($text, array $bad_words) {
 return strpos_arr($text, $bad_words) === false;
}

Обратите внимание, что strpos_arr чувствителен к регистру и возвращает true когда любая строка из иглы является подстрокой в стоге сена, даже если она является частью более крупного слова. Эта функция решает обе проблемы:

function has_bad_word($text, array $bad_words) {
 $pregQuotedBadWords = array_map('preg_quote', $bad_words, array('/'));
 $badWordsRegex = '/((\s+|^)'
 . join('(\s+|$))|((\s+|^)', $pregQuotedBadWords)
 . '(\s+|$))/is';
 return preg_match($badWordsRegex, $text) > 0;
}

licensed under cc by-sa 3.0 with attribution.