麻烦简单的PHP亵渎过滤器

时间:2009-08-01 05:53:43

标签: php filter

我正在用PHP编写一个简单的亵渎过滤器。任何人都可以告诉我为什么,在下面的代码中,过滤器工作(它将打印[explicit])为$ 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;
 }

当使用$元音代替$ array时,除了返回的小写元音外,它有效:

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

 instead of 

 [explicit]

不确定为什么会这样。

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

因为过滤器的输出包含小写元音,这也是您要过滤的字符。即你正在创建一个反馈循环。

答案 1 :(得分:1)

首先,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);

答案 2 :(得分:1)

我修改了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;
 }