Problème avec le simple filtre profanity PHP
Question
Je suis en train d’écrire un simple filtre grossier en PHP. Quelqu'un peut-il me dire pourquoi, dans le code suivant, le filtre fonctionne (il affichera [explicitement]) pour le tableau $ voyelles et non pour le tableau $ lines que je construis à partir d'un fichier texte?
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;
}
Lorsque vous utilisez $ voyelles en remplacement de $ array, cela fonctionne sauf pour les voyelles minuscules qui retournent:
[[expl[explicit]c[explicit]t]xpl[explicit]c[explicit]t]
instead of
[explicit]
Je ne sais pas pourquoi cela se passe, non plus.
Des idées?
Merci!
La solution 2
J'ai modifié la solution de Davethegr8 pour obtenir l'exemple de travail suivant:
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;
}
Autres conseils
Parce que la sortie du filtre contient des voyelles minuscules, qui sont également les caractères que vous filtrez. Vous créez une boucle de rétroaction.
Tout d'abord, file_get_contents est une fonction beaucoup plus simple pour lire un fichier dans une variable.
$badwords = explode("\n", file_get_contents('badwords.txt');
Deuxièmement, preg_replace offre des options de remplacement de chaîne beaucoup plus souples. - http://us3.php.net/preg_replace
foreach($badwords as $word) {
$patterns[] = '/'.$word.'/';
}
$replacement = '[explicit]';
$output = preg_replace($patterns, $replacement, $input);