使用preg_replace对文件中的单词不起作用

时间:2012-09-20 22:03:13

标签: php preg-replace

这是我的来源

 $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***

我不知道问题是什么

5 个答案:

答案 0 :(得分:6)

根据输出,您的数组中可能有一个空元素。所以它最终匹配一个单词边界(\b)。

要确认这一点,请添加以下内容以调试代码:

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

顺便说一句,循环每个坏词是一种浪费。一旦你解决了上述问题,我建议使用单个正则表达式进行修改。

例如:

\b(one|two|three)\b

答案 1 :(得分: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 ***

答案 2 :(得分:3)

您的文件很可能以换行结束(这是一件好事:* nix系统上的所有文本文件都应该这样),这意味着explode(PHP_EOL, $file1)的最后一个元素是空的(它是最后一个换行符和文件结尾,这没什么。我建议写一下:

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

使用the trim function消除最后一个换行符。

答案 3 :(得分:1)

我认为你需要从爆炸产生的数组中删除空字段

答案 4 :(得分:1)

您应该使用strtr来实现此目的。

你可以使用key => replace传递数组,这比preg_replace更有效

除此之外,必须是糟糕的坏词。