2009-08-01 3 views
1

Ich schreibe einen einfachen Profanity Filter in PHP. Kann mir jemand sagen, warum der Filter im folgenden Code funktioniert (er wird [explizit] ausgeben) für das $ vowels-Array und nicht für das $ line-Array, das ich aus einer Textdatei konstruiere?Probleme mit dem einfachen PHP Profanity Filter

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; 
} 

Wenn $ Vokaln in von $ Array ersetzen, es funktioniert mit Ausnahme von Klein Vokale, die Rückkehr:

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

instead of 

[explicit] 

nicht sicher, warum das passiert ist, auch nicht.

Irgendwelche Ideen?

Danke!

Antwort

1

I Davethegr8-Lösung zu erhalten, die folgenden Arbeits geändert Beispiel:

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

Da die Ausgabe des Filters kleingeschriebene Vokale enthält, die auch die Zeichen sind, die Sie filtern. Sie erstellen nämlich eine Feedback-Schleife.

+0

Guter Punkt ! Danke – littleK

1

Zunächst ist file_get_contents eine viel einfachere Funktion zum Lesen einer Datei in eine Variable.

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

Zweitens bietet preg_replace viel flexiblere String-Replacement-Optionen. - http://us3.php.net/preg_replace

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

$replacement = '[explicit]'; 

$output = preg_replace($patterns, $replacement, $input); 
+1

Das ist ein ziemlich schlechtes Codebeispiel Sie haben angegeben, dass nur das letzte Wort in der badwords.txt durch den Text '[explizit]' ersetzt wird. Wenn überhaupt, sollten Sie einfach den Foreach entfernen und folgendes tun: $ output = preg_replace ($ badwords, $ replacement, $ input); – Andy

+1

@andy - haha, oops. Es war spät in der Nacht und ich habe ein [] vergessen. :) – davethegr8