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 更有效率

除此之外,一定是不好的badwords dic。

于 2012-09-20T22:07:56.843 回答