Basit bir PHP küfür filtresi ile Trouble

4 Cevap php

PHP basit bir küfür filtresi yazıyorum. Herkes söyleyebilir benim neden, aşağıdaki kodda, filtre $ ünlüler dizisi ve ben bir metin dosyası oluşturarak değil $ çizgiler dizisi için (o [açık] basacaktır) çalışır?

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

$ Dizi yerine dolar ünlüleri kullanırken, geri dönmek küçük ünlüler hariç çalışır:

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

 instead of 

 [explicit]

Bu da oluyor, neden emin değil.

Herhangi bir fikir?

Teşekkürler!

4 Cevap

Aşağıdaki çalışma örneği elde etmek için Davethegr8 çözümünü değiştirilmiştir

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

Okudum emin olun:

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

Eğer dize değiştirme yolda devam etmek seçmeden önce ...

Filtrenin çıkış da filtre uyguluyorsanız karakterler küçük harf ünlüleri, içerdiğinden. Yani bir geri besleme döngüsü yaratıyoruz.

Öncelikle, file_get_contents bir değişken içine bir dosyayı okumak için çok daha basit bir fonksiyonudur.

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

İkincisi, preg_replace çok daha esnek bir dize değiştirme seçenekleri sunuyor. - http://us3.php.net/preg_replace

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

$replacement = '[explicit]';

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