Это эффективное кодирование для защиты от спама? - PullRequest
1 голос
/ 21 сентября 2009
if(strpos($string, "A Bad Word") != false){
    echo 'This word is not allowed';
}
if(strpos($string, "A Bad Word") != false){
    echo 'This word is not allowed';
}

Хорошо, я пытаюсь проверить отправленные данные, чтобы увидеть, есть ли неподходящие слова. Вместо 5 экземпляров, есть ли более эффективный способ?

Ответы [ 7 ]

6 голосов
/ 21 сентября 2009

Я уверен, что есть более умный способ сделать это в целом.

Если вы просто хотите быть более лаконичным, то, вероятно, лучше зациклить некоторые плохие слова, вместо добавления повторяющихся, почти идентичных, условий (ifs):

<?PHP
$banned = array('bad','words','like','these');

$looksLikeSpam = false;
foreach($banned as $naughty){
    if (strpos($string,$naugty) !== false){
        $looksLikeSpam=true;
    }
}

if ($looksLikeSpam){
   echo "You're GROSS!  Just... ew!";
   die();
}

Редактировать: Также обратите внимание, что в вашем коде вопроса вы проверяете strpos! = False. Вы действительно хотите! ==, так как strpos () вернет 0, если первое слово, скажем, PENIS. 0 будет приведен к ложному. Видишь, куда я иду?

Кроме того, вы, вероятно, захотите использовать stripos (), чтобы не учитывать регистр (если только вам не важно, если люди СКАЖУТ оскорбительные слова): -)

2 голосов
/ 04 октября 2009

Нет, это дерьмо. Существует целая ветвь информатики, касающаяся алгоритмов поиска строк . Черт, Кнут даже выделил ему половину TAOCP Volume 3 .

Бойер-Мур - хороший алгоритм, который сейчас используется во многих приложениях, связанных с поиском нескольких игл в стоге сена.

2 голосов
/ 21 сентября 2009

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

$badwords = array('staircase', 'tuna', 'pillow');
$badwords_regex = '/' . implode('|', $badwords) . '/i';

$contains_badwords = preg_match($badwords_regex, $text);
1 голос
/ 21 сентября 2009

Вы должны быть осторожны с границами слов, иначе люди будут жаловаться на невозможность ввести такие слова, как "волан".

Надеюсь, вы (или ваш клиент) понимаете, что автоматическая фильтрация "непослушного слова" не устраняет необходимость модерирования. Есть много способов быть оскорбительными, не используя ни одного из якобы непослушных слов. Даже решение о том, что является или не является оскорбительным, зависит от культурного контекста.

0 голосов
/ 21 сентября 2009

Вы можете использовать функцию PHP in_array вместо цикла, если вы проверяете одно слово. Хотя регулярное выражение будет лучше, если вы проверяете целое предложение.

http://us2.php.net/manual/en/function.in-array.php

$bad_word_array=array('weenis','dolt','wanker');

$passed=in_array($suspected_word,$bad_word_array);
0 голосов
/ 21 сентября 2009

Использовать массив значений и выполнять итерацию по массиву, каждый раз проверяя переданное слово. Если найдено совпадение, выйдите из цикла и верните true.

0 голосов
/ 21 сентября 2009

Вы можете объединить их в одно регулярное выражение, а затем использовать preg_grep (), чтобы подтвердить их существование

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