我正在用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]
不确定为什么会这样。
有什么想法吗?
谢谢!
答案 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;
}