0

これが私の情報源です

 $Message = $_GET["message"];
 $Username = htmlspecialchars($_GET["username"]);
 $unix = ($_GET["time"]);
 include 'mcheck.php'; 
$file1 = file_get_contents('filter.txt');
$bad_words = explode(PHP_EOL, $file1);
$compare = explode('', $Message);
foreach ($bad_words as $bad_word)
  $Message = preg_replace('/\b('.$bad_word.')\b/i', "***", $Message);
  echo $Message;

悪い言葉はgo

$Message = I Like to go to school

したいecho I Like to *** to school

しかし、代わりに私は取得しています

***I***Like***To******to***school***

私は問題が何であるかわかりません

4

5 に答える 5

6

出力に基づいて、配列に空の要素がある可能性があります。したがって、最終的には単語の境界(\b)と一致します。

これを確認するには、以下を追加してコードをデバッグします。

$bad_words = explode(PHP_EOL, $file1);
print_r($bad_words);

余談ですが、各悪い単語をループするのは無駄です。上記を解決したら、変更を加えた単一の正規表現を使用することをお勧めします。

例えば:

\b(one|two|three)\b
于 2012-09-20T22:06:10.180 に答える
4

使ってみませんかstr_replace

$badWords = array("go","school");
$message = " I like to go to school" ;
$newMessage = str_replace($badWords, "***", $message);
echo $newMessage ;

出力

 I like to *** to ***
于 2012-09-20T22:07:24.580 に答える
3

ファイルはおそらく改行で終わります(これは良いことです:* nixシステム上のすべてのテキストファイルが想定されています)。これは、の最後の要素explode(PHP_EOL, $file1)が空であることを意味します(最後の改行とファイルの終わりの間のすべてです) 、これは何もありません)。私は書くことをお勧めします:

$file1 = trim(file_get_contents('filter.txt'));

関数を使用して、trim最後の改行を削除します。

于 2012-09-20T22:08:25.000 に答える
1

結果の配列を分解するために空のフィールドを削除する必要があると思います

于 2012-09-20T22:06:48.850 に答える
1

strtrこの目的で使用する必要があります。

key => replaceを使用して配列を渡すことができます。これは、preg_replaceよりもいくらか効率的です。

それとは別に、悪いbadwordsdicである必要があります。

于 2012-09-20T22:07:56.843 に答える