Проблема с простым фильтром ненормативной лексики PHP - PullRequest
0 голосов
/ 01 августа 2009

Я пишу простой фильтр ненормативной лексики в PHP.Может кто-нибудь сказать, почему в следующем коде фильтр работает (он будет печатать [явный]) для массива $ vowels, а не для массива $ lines, который я строю из текстового файла?

 function clean($str){

$handle = fopen("badwords.txt", "r");
if ($handle) {
   while (!feof($handle)) {
       $array[] = fgets($handle, 4096);
   }
   fclose($handle);
}

$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");

$filter = "[explicit]";
$clean = str_replace($array, $filter, $str);
return $clean;
 }

При использовании гласных $ вместо массива $ он работает, за исключением строчных гласных, которые возвращают:

 [[expl[explicit]c[explicit]t]xpl[explicit]c[explicit]t]

 instead of 

 [explicit]

Также не уверен, почему это происходит.

Есть идеи?

Спасибо!

Ответы [ 3 ]

1 голос
/ 01 августа 2009

Во-первых, file_get_contents - намного более простая функция для чтения файла в переменную.

$badwords = explode("\n", file_get_contents('badwords.txt');

Во-вторых, preg_replace предлагает гораздо более гибкие варианты замены строк. - http://us3.php.net/preg_replace

foreach($badwords as $word) {
    $patterns[] = '/'.$word.'/';
}

$replacement = '[explicit]';

$output = preg_replace($patterns, $replacement, $input);
1 голос
/ 01 августа 2009

Я изменил решение Davethegr8, чтобы получить следующий рабочий пример:

 function clean($str){

global $clean_words; 

$replacement = '[explicit]';

if(empty($clean_words)){
    $badwords = explode("\n", file_get_contents('badwords.txt'));

    $clean_words = array();

    foreach($badwords as $word) {
        $clean_words[]= '/(\b' . trim($word) . '\b)/si';
    }
}

$out = preg_replace($clean_words, $replacement, $str);
return $out;
 }
1 голос
/ 01 августа 2009

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

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