2009-08-01 3 views
1

私はPHPで簡単な冒涜フィルタを書いています。誰かが私の理由を教えてもらえますか?次のコードで、フィルターは$母音配列のために(明示的に)出力され、テキストファイルから構築する$ lines配列は出力されません。シンプルなPHP冒涜フィルタの問題

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] 

ないことはどちらか、起こっている理由を確認してください。

アイデア?

ありがとうございます!

答えて

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

フィルタの出力には小文字の母音が含まれているため、これはフィルタリングする文字でもあります。つまり、フィードバックループを作成しています。

+0

良い点!ありがとう – littleK

1

まず、file_get_contentsは、ファイルを変数に読み込むもっと簡単な関数です。

第2に、preg_replaceはより柔軟な文字列置換オプションを提供します。 - http://us3.php.net/preg_replace

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

$replacement = '[explicit]'; 

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

これは非常に悪いコード例ですbadwords.txtの最後の単語だけが '[explicit]'というテキストに置き換えられました。何かがあれば、単にforeachを削除して、次のようにします:$ output = preg_replace($ badwords、$ replacement、$ input); – Andy

+1

@andy - haha​​、oops。昨晩遅れて、私は[]を忘れてしまった。 :) – davethegr8

2

あなたが読んでいることを確認してください:

Coding Horror: Obscenity Filters: Bad Idea, or Incredibly Intercoursing Bad Idea?

を使用すると、文字列置換の道路上で継続することを選択する前に...

+1

これでスキミングして、あまりにも疲れて今すぐすべてを読むことはできません。とても面白いですが、ありがとう! – littleK

+0

基本的には、それを解釈せずに人間の言語をフィルタリングすることができないと述べています。 Google for 'clbuttic' – Jacco